diff --git a/TestSuite/errors/err0371_static_predefinition.pas b/TestSuite/errors/err0371_static_predefinition.pas new file mode 100644 index 000000000..20e82b096 --- /dev/null +++ b/TestSuite/errors/err0371_static_predefinition.pas @@ -0,0 +1,13 @@ +// #2266 +type + T1 = class; + + {T2 = class + tt: T1; + end;} + + T1 = static class + //public static a: integer; + 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 59a06a58f..a7ceb1829 100644 --- a/TreeConverter/TreeConversion/syntax_tree_visitor.cs +++ b/TreeConverter/TreeConversion/syntax_tree_visitor.cs @@ -11536,6 +11536,15 @@ namespace PascalABCCompiler.TreeConverter //bool is_template_synonym = false; //SyntaxTree.array_type at=_type_declaration.type_def as SyntaxTree.array_type; + if (_type_declaration.type_def is class_definition cd && cd.keyword == class_keyword.Class && + (cd.attribute & SyntaxTree.class_attribute.Static) == SyntaxTree.class_attribute.Static) + { + var name = _type_declaration.type_name.name.ToLower(); + if(context.types_predefined.Select(tn => tn.name.ToLower()).Contains(name)) + AddError(get_location(_type_declaration), "STATIC_CLASS_CANNOT_HAVE_PREDEFINITION"); // #2266 + } + + template_class tc = null; SyntaxTree.template_type_name ttn = _type_declaration.type_name as SyntaxTree.template_type_name; SyntaxTree.class_definition cl_def = _type_declaration.type_def as SyntaxTree.class_definition; diff --git a/bin/Lng/Eng/SemanticErrors_ms.dat b/bin/Lng/Eng/SemanticErrors_ms.dat index 35a546dfc..6d3acbb49 100644 --- a/bin/Lng/Eng/SemanticErrors_ms.dat +++ b/bin/Lng/Eng/SemanticErrors_ms.dat @@ -39,4 +39,5 @@ ONE_DIM_ARRAY_OR_LIST_EXPECTED=One-dimensional array or list expected TUPLE_TYPE_ELEMENTS_COUNT_MUST_BE_LESSEQUAL_7=Number of elements in tuple type must be less than 8 OVERRIDE_METHODS_CANNOT_CONTAIN_WHERE_SECTION=Methods with override modifier can't contain where section override where -EXPLICIT_CASTS_FOR_LAMBDA_EXPRESSIONS_ARE_FORBIDDEN=Explicit type casts for lambda expressions are forbidden \ No newline at end of file +EXPLICIT_CASTS_FOR_LAMBDA_EXPRESSIONS_ARE_FORBIDDEN=Explicit type casts for lambda expressions are forbidden +STATIC_CLASS_CANNOT_HAVE_PREDEFINITION=Static class cannot be predefined \ No newline at end of file diff --git a/bin/Lng/Rus/SemanticErrors_ms.dat b/bin/Lng/Rus/SemanticErrors_ms.dat index 8b91357d9..c5d8f6fd8 100644 --- a/bin/Lng/Rus/SemanticErrors_ms.dat +++ b/bin/Lng/Rus/SemanticErrors_ms.dat @@ -39,4 +39,5 @@ ACCESS_TO_ENUM_CONST_THROUGH_OBJECT=Нельзя обратиться к эле ONE_DIM_ARRAY_OR_LIST_EXPECTED=Ожидался одномерный массив или список TUPLE_TYPE_ELEMENTS_COUNT_MUST_BE_LESSEQUAL_7=Количество элементов в типе кортежа не должно быть больше 7 OVERRIDE_METHODS_CANNOT_CONTAIN_WHERE_SECTION=Методы с модификатором override не могут содержать собственную секцию where -EXPLICIT_CASTS_FOR_LAMBDA_EXPRESSIONS_ARE_FORBIDDEN=Явные приведения типов для лямбда-выражений запрещены \ No newline at end of file +EXPLICIT_CASTS_FOR_LAMBDA_EXPRESSIONS_ARE_FORBIDDEN=Явные приведения типов для лямбда-выражений запрещены +STATIC_CLASS_CANNOT_HAVE_PREDEFINITION=Статический класс не может иметь предописание \ No newline at end of file