diff --git a/TestSuite/delegates15.pas b/TestSuite/delegates15.pas new file mode 100644 index 000000000..d4a3237d5 --- /dev/null +++ b/TestSuite/delegates15.pas @@ -0,0 +1,13 @@ +function f1(b: byte) := b; +function f2 := 2; +type fnc = function(b: byte): byte; +begin + var o1: object := f1; + var f: fnc := fnc(o1); + assert(f(2) = 2); + var o2: object := f2; + assert(integer(o2) = 2); + o1 := f1; + f := fnc(o1); + assert(f(2) = 2); +end. \ No newline at end of file diff --git a/TreeConverter/TreeConversion/convertion_data_and_alghoritms.cs b/TreeConverter/TreeConversion/convertion_data_and_alghoritms.cs index edf3e63d5..a2ca94aea 100644 --- a/TreeConverter/TreeConversion/convertion_data_and_alghoritms.cs +++ b/TreeConverter/TreeConversion/convertion_data_and_alghoritms.cs @@ -662,7 +662,12 @@ namespace PascalABCCompiler.TreeConverter } en.location = loc; if (en.type is delegated_methods dm && dm.proper_methods[0].parameters.Count == 0 && dm.proper_methods[0].ret_type != null) - AddError(new CanNotConvertTypes(en, dm.proper_methods[0].ret_type, to, loc)); // SSM 18/06/20 #2261 + { + if (to != SystemLibrary.SystemLibrary.object_type) + AddError(new CanNotConvertTypes(en, dm.proper_methods[0].ret_type, to, loc)); // SSM 18/06/20 #2261 + else + return en; + } else if (en.type is undefined_type && en is base_function_call bfc) throw new SimpleSemanticError(loc, "RETURN_TYPE_UNDEFINED_{0}", bfc.function.name); else AddError(new CanNotConvertTypes(en, en.type, to, loc));