Smarter pseudo_instance fixing

This commit is contained in:
Sun Serega 2022-10-06 08:48:14 +03:00
parent 1eb9b28c0f
commit f49e132d38
2 changed files with 19 additions and 5 deletions

10
TestSuite/generics66.pas Normal file
View file

@ -0,0 +1,10 @@
type
i1<T> = interface end;
i2<T> = interface
where T: i1<byte>;
end;
t1<T> = class(i1<T>, i2<t1<byte>>) end;
t2<T> = class(i2<t1<byte>>, i1<T>) end;
begin end.

View file

@ -3866,12 +3866,16 @@ namespace PascalABCCompiler.TreeConverter
foreach (generic_type_instance_info gti in generic_convertions.get_type_instances(converted_type))
{
//TODO Зачем?
if (gti.pseudo_instance.base_type != null && gti.pseudo_instance.base_type.is_generic_type_instance && converted_type.IsPartial) continue;
//TODO "t1<T> = class(i1<T>)" => "t1<byte>" реализует "i1<T>" вместо "i1<byte>"???
gti.pseudo_instance.SetBaseType(converted_type.base_type);
//TODO Было для #2524, но с generic_convertions.determine_type оно не нужно
//if (gti.pseudo_instance.base_type != null && gti.pseudo_instance.base_type.is_generic_type_instance && converted_type.IsPartial) continue;
// "t1<T> = class(i1<T>)" => "t1<byte>" реализует "i1<byte>" а не "i1<T>"
gti.pseudo_instance.SetBaseType(generic_convertions.determine_type(converted_type.base_type, gti.param_types, false));
gti.pseudo_instance.ImplementingInterfaces.Clear();
gti.pseudo_instance.ImplementingInterfaces.AddRange(converted_type.ImplementingInterfaces);
foreach (type_node t in converted_type.ImplementingInterfaces)
gti.pseudo_instance.ImplementingInterfaces.Add(generic_convertions.determine_type(t, gti.param_types, false));
}
// Проверяем секции where предка/интерфейсов