fix #2519
This commit is contained in:
parent
c18abaecd4
commit
9b82afda54
|
|
@ -1,11 +1,13 @@
|
||||||
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;
|
||||||
|
|
||||||
|
|
@ -13,6 +15,6 @@
|
||||||
end;
|
end;
|
||||||
|
|
||||||
begin
|
begin
|
||||||
new c2<c3>;
|
new c2<c3>;
|
||||||
new c3;
|
new c3;
|
||||||
end.
|
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");
|
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");
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue