From 474b477deb75ba161d4e29a7b0e20dba7e0563a4 Mon Sep 17 00:00:00 2001 From: Ivan Bondarev Date: Tue, 16 Mar 2021 20:29:26 +0100 Subject: [PATCH] #2092 --- TestSuite/generics51.pas | 17 +++++++++++++ TreeConverter/TreeRealization/generics.cs | 30 ++++++++++++++++++++--- 2 files changed, 43 insertions(+), 4 deletions(-) create mode 100644 TestSuite/generics51.pas diff --git a/TestSuite/generics51.pas b/TestSuite/generics51.pas new file mode 100644 index 000000000..0d819bf20 --- /dev/null +++ b/TestSuite/generics51.pas @@ -0,0 +1,17 @@ +type + I1=interface end; + C1=class(I1) end; + C2=class(C1) end; + +procedure p1(self: sequence of T; l: T->T1; o: I1); extensionmethod; +begin + assert(typeof(T) = typeof(byte)); + assert(typeof(T1) = typeof(integer)); +end; +procedure p2(self: sequence of T; o: I1); extensionmethod := exit; + +begin + // любая 1 из этих строк даёт ошибку: + Seq&.p1(b->0,new C2); + Seq&.p2(new C2); +end. \ No newline at end of file diff --git a/TreeConverter/TreeRealization/generics.cs b/TreeConverter/TreeRealization/generics.cs index 001116943..435bcf712 100644 --- a/TreeConverter/TreeRealization/generics.cs +++ b/TreeConverter/TreeRealization/generics.cs @@ -1282,14 +1282,36 @@ namespace PascalABCCompiler.TreeRealization base_type = base_type.base_type; } if (fact_type.ImplementingInterfaces != null && fact_type_converted == null) - foreach (type_node ti in fact_type.ImplementingInterfaces) { - if (ti.original_generic == formal_type.original_generic) + foreach (type_node ti in fact_type.ImplementingInterfaces) { - fact_type_converted = ti; - break; + if (ti.original_generic == formal_type.original_generic) + { + fact_type_converted = ti; + break; + } + } + if (fact_type_converted == null) + { + base_type = fact_type.base_type; + while (base_type != null) + { + if (base_type.ImplementingInterfaces != null) + foreach (type_node ti in base_type.ImplementingInterfaces) + { + if (ti.original_generic == formal_type.original_generic) + { + fact_type_converted = ti; + break; + } + } + if (fact_type_converted != null) + break; + base_type = base_type.base_type; + } } } + if (fact_type_converted == null) goto eq_cmp; } else