diff --git a/TestSuite/where16.pas b/TestSuite/where16.pas index 229097938..d30f42aba 100644 --- a/TestSuite/where16.pas +++ b/TestSuite/where16.pas @@ -1,18 +1,20 @@ type - c1 = class where T1: c1; + c1 = class + where T1: c1; end; //Ошибка: Несоответствие спецификатора whеre спецификатору where базового класса - c2 = class(c1) where T2: c1; + c2 = class(c1) + where T2: c1; end; c3 = class(c1) end; -begin -new c2; -new c3; +begin + new c2; + new c3; end. \ No newline at end of file diff --git a/TestSuite/where18.pas b/TestSuite/where18.pas new file mode 100644 index 000000000..4094c9975 --- /dev/null +++ b/TestSuite/where18.pas @@ -0,0 +1,16 @@ +// #2519 +type + Base = class end; + Def = class(Base) end; + + t0 = class + where T: Base; + + end; + //Ошибка: Несоответствие спецификатора where спецификатору where базового класса + t1 = class(t0) + where T2: Def; + + end; + +begin end. \ No newline at end of file diff --git a/TreeConverter/TreeConversion/syntax_tree_visitor.cs b/TreeConverter/TreeConversion/syntax_tree_visitor.cs index 39bd9c1ba..bc8869190 100644 --- a/TreeConverter/TreeConversion/syntax_tree_visitor.cs +++ b/TreeConverter/TreeConversion/syntax_tree_visitor.cs @@ -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 и c1 это не всегда одно и тоже - только если 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"); }