This commit is contained in:
Ivan Bondarev 2021-03-16 20:29:26 +01:00
parent 8520567891
commit 474b477deb
2 changed files with 43 additions and 4 deletions

17
TestSuite/generics51.pas Normal file
View file

@ -0,0 +1,17 @@
type
I1<T>=interface end;
C1<T>=class(I1<T>) end;
C2=class(C1<integer>) end;
procedure p1<T,T1>(self: sequence of T; l: T->T1; o: I1<T1>); extensionmethod;
begin
assert(typeof(T) = typeof(byte));
assert(typeof(T1) = typeof(integer));
end;
procedure p2<T,T1>(self: sequence of T; o: I1<T1>); extensionmethod := exit;
begin
// любая 1 из этих строк даёт ошибку:
Seq&<byte>.p1(b->0,new C2);
Seq&<byte>.p2(new C2);
end.

View file

@ -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