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; //Сюда будет записан фактический тип или интерфейс, к которому он приводится
|
type_node fact_type_converted; //Сюда будет записан фактический тип или интерфейс, к которому он приводится
|
||||||
if (!fact_type.is_generic_type_instance || formal_type.original_generic != fact_type.original_generic)
|
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;
|
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)
|
foreach (type_node ti in fact_type.ImplementingInterfaces)
|
||||||
{
|
{
|
||||||
if (ti.original_generic == formal_type.original_generic)
|
if (ti.original_generic == formal_type.original_generic)
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue