@@ -4177,17 +4177,36 @@ procedure TdwsCompiler.ReadPostConditions(funcSymbol : TFuncSymbol; conditions :
41774177 TFindOverloadedFunc = class
41784178 OpSymbol : TOperatorSymbol;
41794179 CapturableUsesSym : TFuncSymbol;
4180- function Callback(symbol : TSymbol) : Boolean;
4180+ function Callback1(symbol : TSymbol) : Boolean;
4181+ function Callback2(symbol : TSymbol) : Boolean;
41814182 end;
41824183
4183- function TFindOverloadedFunc.Callback (symbol : TSymbol) : Boolean;
4184+ function TFindOverloadedFunc.Callback1 (symbol : TSymbol) : Boolean;
41844185var
41854186 funcSym : TFuncSymbol;
41864187begin
41874188 Result:=False;
41884189 funcSym:=symbol.AsFuncSymbol;
41894190 if (funcSym<>nil) and (not symbol.IsType) then begin
4190- if (funcSym.Params.Count=2) and (funcSym.Typ<>nil)
4191+ if (funcSym.Params.Count = 1) and (funcSym.Typ<>nil)
4192+ and (Length(opSymbol.Params) = 1)
4193+ and funcSym.Typ.IsOfType(opSymbol.Typ)
4194+ and funcSym.Params[0].Typ.IsOfType(opSymbol.Params[0]) then begin
4195+ CapturableUsesSym:=funcSym;
4196+ Result:=True;
4197+ end;
4198+ end;
4199+ end;
4200+
4201+ function TFindOverloadedFunc.Callback2(symbol : TSymbol) : Boolean;
4202+ var
4203+ funcSym : TFuncSymbol;
4204+ begin
4205+ Result:=False;
4206+ funcSym:=symbol.AsFuncSymbol;
4207+ if (funcSym<>nil) and (not symbol.IsType) then begin
4208+ if (funcSym.Params.Count = 2) and (funcSym.Typ<>nil)
4209+ and (Length(opSymbol.Params) = 2)
41914210 and funcSym.Typ.IsOfType(opSymbol.Typ)
41924211 and funcSym.Params[0].Typ.IsOfType(opSymbol.Params[0])
41934212 and funcSym.Params[1].Typ.IsOfType(opSymbol.Params[1]) then begin
@@ -4202,15 +4221,21 @@ function TFindOverloadedFunc.Callback(symbol : TSymbol) : Boolean;
42024221function TdwsCompiler.ReadOperatorDecl : TOperatorSymbol;
42034222
42044223 procedure FindOverloadedFunc(var usesSym : TFuncSymbol; const usesName : String;
4205- fromTable : TSymbolTable; opSymbol : TOperatorSymbol);
4224+ fromTable : TSymbolTable; opSymbol : TOperatorSymbol;
4225+ nbParams : Integer);
42064226 var
42074227 finder : TFindOverloadedFunc;
42084228 begin
4209- finder:= TFindOverloadedFunc.Create;
4229+ finder := TFindOverloadedFunc.Create;
42104230 try
42114231 finder.CapturableUsesSym:=usesSym;
42124232 finder.OpSymbol:=opSymbol;
4213- fromTable.EnumerateSymbolsOfNameInScope(usesName, finder.Callback);
4233+ case nbParams of
4234+ 1 : fromTable.EnumerateSymbolsOfNameInScope(usesName, finder.Callback1);
4235+ 2 : fromTable.EnumerateSymbolsOfNameInScope(usesName, finder.Callback2);
4236+ else
4237+ Assert(False);
4238+ end;
42144239 usesSym:=finder.CapturableUsesSym;
42154240 finally
42164241 finder.Free;
@@ -4295,7 +4320,7 @@ function TdwsCompiler.ReadOperatorDecl : TOperatorSymbol;
42954320 if usesSym<>nil then begin
42964321
42974322 if usesSym.IsOverloaded then
4298- FindOverloadedFunc(usesSym, usesName, fromTable, Result);
4323+ FindOverloadedFunc(usesSym, usesName, fromTable, Result, expectedNbParams );
42994324
43004325 RecordSymbolUse(usesSym, usesPos, [suReference]);
43014326
@@ -5146,10 +5171,12 @@ function TdwsCompiler.ReadImplicitCall(codeExpr : TTypedExpr; isWrite: Boolean;
51465171 and codeExprTyp.IsOfType(expecting)
51475172 and not FTok.Test(ttBLEFT)) then
51485173 Result:=codeExpr
5174+ else if not funcSym.IsOverloaded then
5175+ Result := ReadFunc(funcSym, codeExpr, expecting)
51495176 else begin
5150- Assert(not funcSym.IsOverloaded);
5177+ FMsgs.AddCompilerStopFmt(codeExpr.ScriptPos, CPH_AmbiguousMatchingOverloadsForCall, [ funcSym.Name ]);
5178+ Result := codeExpr;
51515179 // Result:=ReadFuncOverloaded(funcSym, fromTable, varExpr, expecting)
5152- Result:=ReadFunc(funcSym, codeExpr, expecting);
51535180 end;
51545181 end else Result:=codeExpr;
51555182
0 commit comments