fix #2519
This commit is contained in:
parent
c18abaecd4
commit
9b82afda54
|
|
@ -1,18 +1,20 @@
|
|||
type
|
||||
|
||||
c1<T1> = class where T1: c1<T1>;
|
||||
c1<T1> = class
|
||||
where T1: c1<T1>;
|
||||
|
||||
end;
|
||||
|
||||
//Ошибка: Несоответствие спецификатора whеre спецификатору where базового класса
|
||||
c2<T2> = class(c1<T2>) where T2: c1<T2>;
|
||||
c2<T2> = class(c1<T2>)
|
||||
where T2: c1<T2>;
|
||||
|
||||
end;
|
||||
|
||||
c3 = class(c1<c3>)
|
||||
end;
|
||||
|
||||
begin
|
||||
new c2<c3>;
|
||||
new c3;
|
||||
begin
|
||||
new c2<c3>;
|
||||
new c3;
|
||||
end.
|
||||
16
TestSuite/where18.pas
Normal file
16
TestSuite/where18.pas
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
// #2519
|
||||
type
|
||||
Base = class end;
|
||||
Def = class(Base) end;
|
||||
|
||||
t0<T> = class
|
||||
where T: Base;
|
||||
|
||||
end;
|
||||
//Ошибка: Несоответствие спецификатора where спецификатору where базового класса
|
||||
t1<T2> = class(t0<T2>)
|
||||
where T2: Def;
|
||||
|
||||
end;
|
||||
|
||||
begin end.
|
||||
|
|
@ -12762,7 +12762,13 @@ namespace PascalABCCompiler.TreeConverter
|
|||
AddError(ctn.loc, "WHERE_SPECIFIER_MISMATCH");
|
||||
if (t.methods.Length > thist.methods.Length)
|
||||
AddError(ctn.loc, "WHERE_SPECIFIER_MISMATCH");
|
||||
if (t.base_type != SystemLibrary.SystemLibrary.object_type && !type_table.is_type_or_original_generics_equal(t.base_type as type_node, thist.base_type as type_node))
|
||||
|
||||
var old_base = t.base_type as type_node;
|
||||
var new_base = thist.base_type as type_node;
|
||||
//ToDo: (тест where16) с1<T1> и c1<T2> это не всегда одно и тоже - только если T2 подставили вместо T1
|
||||
old_base = old_base.original_generic;
|
||||
new_base = new_base.original_generic;
|
||||
if (old_base!=new_base && !type_table.is_derived(old_base, new_base))
|
||||
AddError(ctn.loc, "WHERE_SPECIFIER_MISMATCH");
|
||||
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue