diff --git a/TestSuite/delegates18.pas b/TestSuite/delegates18.pas new file mode 100644 index 000000000..442bc58bd --- /dev/null +++ b/TestSuite/delegates18.pas @@ -0,0 +1,20 @@ +var i: integer; + +procedure p(x: Object); +begin + i := 1; +end; +procedure p(x: procedure); +begin + i := 2; +end; + +procedure x := exit; +procedure xx(a: integer) := exit; +begin + var proc: procedure := x; + p(x); + assert(i = 2); + p(xx); + assert(i = 1); +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 b5e09aeae..d21971438 100644 --- a/TreeConverter/TreeConversion/convertion_data_and_alghoritms.cs +++ b/TreeConverter/TreeConversion/convertion_data_and_alghoritms.cs @@ -1259,7 +1259,9 @@ namespace PascalABCCompiler.TreeConverter { if ((left.first==null)&&(right.first!=null)) { - return type_conversion_compare.greater_type_conversion; + if (right.from.IsDelegate && right.to.IsDelegate && left.to == SystemLibrary.SystemLibrary.object_type) + return type_conversion_compare.less_type_conversion;//right.first != null из-за структурной эквивалентности процедурных типов и в силу того, что для каждого процедурного типа создается свой класс и и создается пустой метод преобразования типов + return type_conversion_compare.greater_type_conversion; } if ((left.first!=null)&&(right.first==null)) {