This commit is contained in:
Ivan Bondarev 2023-11-19 11:53:57 +01:00
parent fbbcb276aa
commit 6bc05f0f90
2 changed files with 29 additions and 5 deletions

View file

@ -0,0 +1,21 @@
//!Несколько подпрограмм proc1 могут быть вызваны
type
c1 = class
// обязательно метод. с подпрограммой не воспроизводится
procedure method1(act: System.Action);
begin end;
end;
procedure proc1(par1: System.Action<integer>); begin end;
procedure proc1(par1: System.Action<real>); begin end;
begin
var var1:= new c1;
var1.method1(
()-> begin
proc1(par1-> begin end);
end
);
end.

View file

@ -1268,9 +1268,12 @@ namespace PascalABCCompiler.TreeConverter
}
else
{
if (!(left is typed_expression))
if (!(left is typed_expression) && !(left.type is delegated_methods))
AddError(new OperatorCanNotBeAppliedToThisTypes(name, left, right, loc));
bfc = ((left as typed_expression).type as delegated_methods).proper_methods[0];
if (left is typed_expression)
bfc = ((left as typed_expression).type as delegated_methods).proper_methods[0];
else
bfc = (left.type as delegated_methods).proper_methods[0];
left = convertion_data_and_alghoritms.explicit_convert_type(left, CreateDelegate(bfc.simple_function_node));
}
@ -5777,8 +5780,8 @@ namespace PascalABCCompiler.TreeConverter
var fl = fld.lambda_visit_mode;
// запомнили типы параметров лямбды - SSM
object[] realparamstype = new object[fld.formal_parameters.params_list.Count]; // здесь хранятся выведенные типы лямбд или null если типы явно заданы
for (var k = 0; k < fld.formal_parameters.params_list.Count; k++)
object[] realparamstype = new object[fld.formal_parameters != null ? fld.formal_parameters.params_list.Count : 0]; // здесь хранятся выведенные типы лямбд или null если типы явно заданы
for (var k = 0; k < (fld.formal_parameters != null ? fld.formal_parameters.params_list.Count : 0); k++)
{
var laminftypeK = fld.formal_parameters.params_list[k].vars_type as SyntaxTree.lambda_inferred_type;
if (laminftypeK == null)
@ -5833,7 +5836,7 @@ namespace PascalABCCompiler.TreeConverter
if (restype != null)
restype.real_type = realrestype;
// восстанавливаем сохраненные типы параметров лямбды, которые не были заданы явно
for (var k = 0; k < fld.formal_parameters.params_list.Count; k++)
for (var k = 0; k < (fld.formal_parameters != null ? fld.formal_parameters.params_list.Count:0); k++)
{
var laminftypeK = fld.formal_parameters.params_list[k].vars_type as SyntaxTree.lambda_inferred_type;
if (laminftypeK != null)