diff --git a/TestSuite/short_fun2.pas b/TestSuite/short_fun2.pas new file mode 100644 index 000000000..5b1f7688b --- /dev/null +++ b/TestSuite/short_fun2.pas @@ -0,0 +1,17 @@ +var i: integer; +type + t1 = class + procedure p1(x: integer); + begin + i := x + end; + end; + +//Ошибка: Операция ':=' не применима к типу procedure(x: byte) +function f1(a: t1) := a.p1; + +begin + var a: t1 := new t1; + f1(a)(2); + assert(i = 2); +end. \ No newline at end of file diff --git a/TreeConverter/TreeConversion/syntax_tree_visitor.cs b/TreeConverter/TreeConversion/syntax_tree_visitor.cs index 9797f7e9d..7d686f618 100644 --- a/TreeConverter/TreeConversion/syntax_tree_visitor.cs +++ b/TreeConverter/TreeConversion/syntax_tree_visitor.cs @@ -1249,10 +1249,20 @@ namespace PascalABCCompiler.TreeConverter { List saved_sil = sil; List saved_sil2 = sil2; - if (!(left is typed_expression)) - AddError(new OperatorCanNotBeAppliedToThisTypes(name, left, right, loc)); - base_function_call bfc = ((left as typed_expression).type as delegated_methods).proper_methods[0]; - left = convertion_data_and_alghoritms.explicit_convert_type(left, CreateDelegate(bfc.simple_function_node)); + base_function_call bfc = null; + if (!(left is typed_expression) && left.type is delegated_methods && name == ":=" && left is local_variable_reference && (left as local_variable_reference).var.type is undefined_type) + { + //left = convertion_data_and_alghoritms.explicit_convert_type(left, CreateDelegate((left.type as delegated_methods).proper_methods[0].simple_function_node)); + left.type = CreateDelegate((left.type as delegated_methods).proper_methods[0].simple_function_node); + } + else + { + if (!(left is typed_expression)) + AddError(new OperatorCanNotBeAppliedToThisTypes(name, left, right, loc)); + bfc = ((left as typed_expression).type as delegated_methods).proper_methods[0]; + left = convertion_data_and_alghoritms.explicit_convert_type(left, CreateDelegate(bfc.simple_function_node)); + } + sil = left.type.find_in_type(name); if (!(right is typed_expression) && right.type is delegated_methods) bfc = (right.type as delegated_methods).proper_methods[0];