diff --git a/TestSuite/generics40.pas b/TestSuite/generics40.pas new file mode 100644 index 000000000..d8bed1ae1 --- /dev/null +++ b/TestSuite/generics40.pas @@ -0,0 +1,22 @@ +var i: integer; +type + t1 = class; + + t0 = class + + public function f1: t1 := nil; + + end; + t1 = class(t0) end; + +procedure p1(q: t1); +begin + Inc(i); +end; + +procedure p1(q: t0) := p1(q.f1&); + +begin + p1(new t0); + 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 d3c0c4212..edf3e63d5 100644 --- a/TreeConverter/TreeConversion/convertion_data_and_alghoritms.cs +++ b/TreeConverter/TreeConversion/convertion_data_and_alghoritms.cs @@ -2088,7 +2088,18 @@ namespace PascalABCCompiler.TreeConverter is_alone_method_defined, syntax_tree_visitor.context, loc, syntax_nodes_parameters); if (inst == null) { - set_of_possible_functions.RemoveAt(i); + try + { + inst = generic_convertions.DeduceFunction(func, parameters, true, syntax_tree_visitor.context, loc, syntax_nodes_parameters); + } + catch + { + + } + if (inst == null) + set_of_possible_functions.RemoveAt(i); + else + set_of_possible_functions[i] = inst; } else {