This commit is contained in:
Бондарев Иван 2018-05-21 13:06:28 +02:00
parent 351ad6b63d
commit 51d81ad056
2 changed files with 52 additions and 2 deletions

40
TestSuite/generics21.pas Normal file
View file

@ -0,0 +1,40 @@
type
t1<T>=class end;
t2=class(t1<byte>) end;
t3 = class(t2) end;
var i: integer;
procedure p1<T>(self:t1<T>);
begin
i := 1;
end;
procedure p2<T>(self:t1<T>); extensionmethod;
begin
i := 2;
end;
procedure p3<T>(self:t1<T>); extensionmethod;
begin
i := 2;
end;
procedure p3(self:t3); extensionmethod;
begin
i := 3;
end;
begin
var a := new t2;
p1(a);
assert(i = 1);
a.p2;
assert(i = 2);
var b := new t3;
i := 0;
p1(b);
assert(i = 1);
b.p2;
assert(i = 2);
b.p3;
assert(i = 3);
a.p3;
assert(i = 2);
end.

View file

@ -1183,9 +1183,19 @@ namespace PascalABCCompiler.TreeRealization
type_node fact_type_converted; //Сюда будет записан фактический тип или интерфейс, к которому он приводится
if (!fact_type.is_generic_type_instance || formal_type.original_generic != fact_type.original_generic)
{
if (!formal_type.IsInterface) goto eq_cmp;
//if (!formal_type.IsInterface) goto eq_cmp;
fact_type_converted = null;
if (fact_type.ImplementingInterfaces != null)
type_node base_type = fact_type.base_type;
while (base_type != null)
{
if (base_type.original_generic == formal_type.original_generic)
{
fact_type_converted = base_type;
break;
}
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)