parent
d963ccdfa9
commit
72a49dc833
27
TestSuite/partial_generics3.pas
Normal file
27
TestSuite/partial_generics3.pas
Normal file
|
|
@ -0,0 +1,27 @@
|
||||||
|
var i: integer;
|
||||||
|
type
|
||||||
|
t1<T> = class
|
||||||
|
procedure p0;
|
||||||
|
begin
|
||||||
|
i := 1;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
// Обязательно промежуточный класс между t1 и t3
|
||||||
|
t2<T> = partial class(t1<T>) end;
|
||||||
|
// Обязательно t3 НЕ шаблонный
|
||||||
|
t3 = partial class(t2<byte>)
|
||||||
|
|
||||||
|
end;
|
||||||
|
|
||||||
|
// Обязательно объявить t2 и t3 дважды
|
||||||
|
t2<T> = partial class(t1<T>) end;
|
||||||
|
t3 = partial class(t2<byte>)
|
||||||
|
// Обязательно вызвать p0 из второго тела t3
|
||||||
|
procedure p1 := self.p0;
|
||||||
|
end;
|
||||||
|
|
||||||
|
begin
|
||||||
|
t3.Create.p1;
|
||||||
|
assert(i = 1);
|
||||||
|
end.
|
||||||
33
TestSuite/partial_generics4.pas
Normal file
33
TestSuite/partial_generics4.pas
Normal file
|
|
@ -0,0 +1,33 @@
|
||||||
|
|
||||||
|
var i: integer;
|
||||||
|
|
||||||
|
type
|
||||||
|
t0<T> = class end;
|
||||||
|
function f0<T>(q: t0<T>): T;
|
||||||
|
begin
|
||||||
|
Result := default(T);
|
||||||
|
i := 1;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
type
|
||||||
|
t1<T> = partial class end;
|
||||||
|
t2<T> = partial class(t0<t1<T>>) end;
|
||||||
|
|
||||||
|
t1<T> = partial class
|
||||||
|
// Обязательно как угодно использовать t2<T>, имено с <T>
|
||||||
|
v0: t2<T>;
|
||||||
|
end;
|
||||||
|
t2<T> = partial class(t0<t1<T>>) end;
|
||||||
|
|
||||||
|
t1<T> = partial class
|
||||||
|
//Ошибка: Нельзя преобразовать тип t1<T> к t1<T>
|
||||||
|
function f1: t1<T> := f0(default(t2<T>));
|
||||||
|
end;
|
||||||
|
|
||||||
|
begin
|
||||||
|
var o := new t1<integer>;
|
||||||
|
var o2 := o.f1;
|
||||||
|
assert(o2 = nil);
|
||||||
|
assert(i = 1);
|
||||||
|
end.
|
||||||
|
|
@ -3787,6 +3787,7 @@ namespace PascalABCCompiler.TreeConverter
|
||||||
if (type_instances != null)
|
if (type_instances != null)
|
||||||
foreach (generic_type_instance_info gti in type_instances)
|
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);
|
gti.pseudo_instance.SetBaseType(tn);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue