This commit is contained in:
Sun Serega 2021-09-19 19:31:38 +03:00
parent c18abaecd4
commit 9b82afda54
3 changed files with 30 additions and 6 deletions

View file

@ -1,18 +1,20 @@
type type
c1<T1> = class where T1: c1<T1>; c1<T1> = class
where T1: c1<T1>;
end; end;
//Ошибка: Несоответствие спецификатора whеre спецификатору where базового класса //Ошибка: Несоответствие спецификатора whеre спецификатору where базового класса
c2<T2> = class(c1<T2>) where T2: c1<T2>; c2<T2> = class(c1<T2>)
where T2: c1<T2>;
end; end;
c3 = class(c1<c3>) c3 = class(c1<c3>)
end; end;
begin begin
new c2<c3>; new c2<c3>;
new c3; new c3;
end. end.

16
TestSuite/where18.pas Normal file
View 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.

View file

@ -12762,7 +12762,13 @@ namespace PascalABCCompiler.TreeConverter
AddError(ctn.loc, "WHERE_SPECIFIER_MISMATCH"); AddError(ctn.loc, "WHERE_SPECIFIER_MISMATCH");
if (t.methods.Length > thist.methods.Length) if (t.methods.Length > thist.methods.Length)
AddError(ctn.loc, "WHERE_SPECIFIER_MISMATCH"); 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"); AddError(ctn.loc, "WHERE_SPECIFIER_MISMATCH");
} }