diff --git a/TestSuite/generics66.pas b/TestSuite/generics66.pas new file mode 100644 index 000000000..4400f50cb --- /dev/null +++ b/TestSuite/generics66.pas @@ -0,0 +1,10 @@ +type + i1 = interface end; + i2 = interface + where T: i1; + end; + + t1 = class(i1, i2>) end; + t2 = class(i2>, i1) end; + +begin end. \ No newline at end of file diff --git a/TreeConverter/TreeConversion/syntax_tree_visitor.cs b/TreeConverter/TreeConversion/syntax_tree_visitor.cs index beacee734..92fa93fa7 100644 --- a/TreeConverter/TreeConversion/syntax_tree_visitor.cs +++ b/TreeConverter/TreeConversion/syntax_tree_visitor.cs @@ -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 = class(i1)" => "t1" реализует "i1" вместо "i1"??? - 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 = class(i1)" => "t1" реализует "i1" а не "i1" + 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 предка/интерфейсов