bug fix #842
This commit is contained in:
parent
351ad6b63d
commit
51d81ad056
40
TestSuite/generics21.pas
Normal file
40
TestSuite/generics21.pas
Normal 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.
|
||||
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Reference in a new issue