diff --git a/TestSuite/partial_generics3.pas b/TestSuite/partial_generics3.pas new file mode 100644 index 000000000..03fb39697 --- /dev/null +++ b/TestSuite/partial_generics3.pas @@ -0,0 +1,27 @@ +var i: integer; +type + t1 = class + procedure p0; + begin + i := 1; + end; + end; + + // Обязательно промежуточный класс между t1 и t3 + t2 = partial class(t1) end; + // Обязательно t3 НЕ шаблонный + t3 = partial class(t2) + + end; + + // Обязательно объявить t2 и t3 дважды + t2 = partial class(t1) end; + t3 = partial class(t2) + // Обязательно вызвать p0 из второго тела t3 + procedure p1 := self.p0; + end; + +begin + t3.Create.p1; + assert(i = 1); +end. \ No newline at end of file diff --git a/TestSuite/partial_generics4.pas b/TestSuite/partial_generics4.pas new file mode 100644 index 000000000..1d9a11749 --- /dev/null +++ b/TestSuite/partial_generics4.pas @@ -0,0 +1,33 @@ + +var i: integer; + +type + t0 = class end; +function f0(q: t0): T; +begin + Result := default(T); + i := 1; +end; + + +type + t1 = partial class end; + t2 = partial class(t0>) end; + + t1 = partial class + // Обязательно как угодно использовать t2, имено с + v0: t2; + end; + t2 = partial class(t0>) end; + + t1 = partial class + //Ошибка: Нельзя преобразовать тип t1 к t1 + function f1: t1 := f0(default(t2)); + end; + +begin + var o := new t1; + var o2 := o.f1; + assert(o2 = nil); + assert(i = 1); +end. \ No newline at end of file diff --git a/TreeConverter/TreeConversion/syntax_tree_visitor.cs b/TreeConverter/TreeConversion/syntax_tree_visitor.cs index 4cda17116..842b82dff 100644 --- a/TreeConverter/TreeConversion/syntax_tree_visitor.cs +++ b/TreeConverter/TreeConversion/syntax_tree_visitor.cs @@ -3787,6 +3787,7 @@ namespace PascalABCCompiler.TreeConverter if (type_instances != null) foreach (generic_type_instance_info gti in type_instances) { + if (!(gti.pseudo_instance.base_type != null && context.converted_type.IsPartial)) gti.pseudo_instance.SetBaseType(tn); } }