diff --git a/TestSuite/errors/err0529.pas b/TestSuite/errors/err0529.pas new file mode 100644 index 000000000..1076920ad --- /dev/null +++ b/TestSuite/errors/err0529.pas @@ -0,0 +1,21 @@ +//!Несколько подпрограмм proc1 могут быть вызваны +type + c1 = class + // обязательно метод. с подпрограммой не воспроизводится + procedure method1(act: System.Action); + begin end; + end; + +procedure proc1(par1: System.Action); begin end; +procedure proc1(par1: System.Action); begin end; + +begin + var var1:= new c1; + + var1.method1( + ()-> begin + proc1(par1-> begin end); + end + ); + +end. \ No newline at end of file diff --git a/TreeConverter/TreeConversion/syntax_tree_visitor.cs b/TreeConverter/TreeConversion/syntax_tree_visitor.cs index d93a0fd4d..64a3125a7 100644 --- a/TreeConverter/TreeConversion/syntax_tree_visitor.cs +++ b/TreeConverter/TreeConversion/syntax_tree_visitor.cs @@ -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)