From a98e6c570f2059b952bcecc41f973b29b9dbdab0 Mon Sep 17 00:00:00 2001 From: Ivan Bondarev Date: Sun, 27 Dec 2020 13:47:42 +0100 Subject: [PATCH] fix #2112 --- TestSuite/errors/err0385.pas | 8 ++++++++ TestSuite/errors/err0386.pas | 8 ++++++++ TestSuite/errors/err0387.pas | 8 ++++++++ TestSuite/errors/err0388.pas | 8 ++++++++ .../TreeConversion/compilation_context.cs | 17 ++++++++++++++++- .../TreeConversion/syntax_tree_visitor.cs | 6 +++--- bin/Lng/Eng/SemanticErrors_ib.dat | 1 + bin/Lng/Rus/SemanticErrors_ib.dat | 1 + bin/Lng/Ukr/SemanticErrors_ib.dat | 1 + 9 files changed, 54 insertions(+), 4 deletions(-) create mode 100644 TestSuite/errors/err0385.pas create mode 100644 TestSuite/errors/err0386.pas create mode 100644 TestSuite/errors/err0387.pas create mode 100644 TestSuite/errors/err0388.pas diff --git a/TestSuite/errors/err0385.pas b/TestSuite/errors/err0385.pas new file mode 100644 index 000000000..4f52ead98 --- /dev/null +++ b/TestSuite/errors/err0385.pas @@ -0,0 +1,8 @@ +type + T1 = partial class a: integer; end; + + T1 = partial static class end; + +begin + +end. \ No newline at end of file diff --git a/TestSuite/errors/err0386.pas b/TestSuite/errors/err0386.pas new file mode 100644 index 000000000..c4b36e2cd --- /dev/null +++ b/TestSuite/errors/err0386.pas @@ -0,0 +1,8 @@ +type + T1 = partial class a: integer; end; + + T1 = partial abstract class end; + +begin + +end. \ No newline at end of file diff --git a/TestSuite/errors/err0387.pas b/TestSuite/errors/err0387.pas new file mode 100644 index 000000000..cd3cd90f4 --- /dev/null +++ b/TestSuite/errors/err0387.pas @@ -0,0 +1,8 @@ +type + T1 = partial class a: integer; end; + + T1 = partial sealed class end; + +begin + +end. \ No newline at end of file diff --git a/TestSuite/errors/err0388.pas b/TestSuite/errors/err0388.pas new file mode 100644 index 000000000..e1ca08b24 --- /dev/null +++ b/TestSuite/errors/err0388.pas @@ -0,0 +1,8 @@ +type + T1 = partial static class static a: integer; end; + + T1 = partial class end; + +begin + +end. \ No newline at end of file diff --git a/TreeConverter/TreeConversion/compilation_context.cs b/TreeConverter/TreeConversion/compilation_context.cs index e9bb5b29e..6fae15e49 100644 --- a/TreeConverter/TreeConversion/compilation_context.cs +++ b/TreeConverter/TreeConversion/compilation_context.cs @@ -1307,13 +1307,28 @@ namespace PascalABCCompiler.TreeConverter return cfn; } - public common_type_node advanced_create_type(string name,location def_loc, bool type_is_interface, bool is_partial=false) + public common_type_node advanced_create_type(string name,location def_loc, bool type_is_interface, bool is_partial=false, SyntaxTree.class_attribute attr = SyntaxTree.class_attribute.None) { //check_name_free(name,def_loc); common_type_node partial_class = null; common_type_node rez = check_type_name_free_and_predop(name, def_loc, ref partial_class, is_partial); if (rez != null) { + if (is_partial) + { + if ((attr & SyntaxTree.class_attribute.Static) == SyntaxTree.class_attribute.Static && !rez.IsStatic) + AddError(def_loc, "PARTIAL_CLASS_ATTRIBUTES_MISMATCH"); + if ((attr & SyntaxTree.class_attribute.Static) != SyntaxTree.class_attribute.Static && rez.IsStatic) + AddError(def_loc, "PARTIAL_CLASS_ATTRIBUTES_MISMATCH"); + if ((attr & SyntaxTree.class_attribute.Abstract) == SyntaxTree.class_attribute.Abstract && !rez.IsAbstract) + AddError(def_loc, "PARTIAL_CLASS_ATTRIBUTES_MISMATCH"); + if ((attr & SyntaxTree.class_attribute.Abstract) != SyntaxTree.class_attribute.Abstract && rez.IsAbstract && !rez.IsStatic) + AddError(def_loc, "PARTIAL_CLASS_ATTRIBUTES_MISMATCH"); + if ((attr & SyntaxTree.class_attribute.Sealed) == SyntaxTree.class_attribute.Sealed && !rez.IsSealed) + AddError(def_loc, "PARTIAL_CLASS_ATTRIBUTES_MISMATCH"); + if ((attr & SyntaxTree.class_attribute.Sealed) != SyntaxTree.class_attribute.Sealed && rez.IsSealed && !rez.IsStatic) + AddError(def_loc, "PARTIAL_CLASS_ATTRIBUTES_MISMATCH"); + } _ctn = rez; if (def_loc != null) _ctn.loc = def_loc; diff --git a/TreeConverter/TreeConversion/syntax_tree_visitor.cs b/TreeConverter/TreeConversion/syntax_tree_visitor.cs index d09185672..e46aead15 100644 --- a/TreeConverter/TreeConversion/syntax_tree_visitor.cs +++ b/TreeConverter/TreeConversion/syntax_tree_visitor.cs @@ -11160,9 +11160,9 @@ namespace PascalABCCompiler.TreeConverter AddError(get_location(cl_def), "TYPE_PREDEFINITION_NOT_ALLOWED"); common_type_node ctn = null; if (td.type_name is template_type_name) - ctn = context.advanced_create_type(td.type_name.name + "`" + (td.type_name as template_type_name).template_args.Count, get_location(td.type_name), (td.type_def as class_definition).keyword == class_keyword.Interface, (cl_def.attribute & SyntaxTree.class_attribute.Partial) == SyntaxTree.class_attribute.Partial); + ctn = context.advanced_create_type(td.type_name.name + "`" + (td.type_name as template_type_name).template_args.Count, get_location(td.type_name), (td.type_def as class_definition).keyword == class_keyword.Interface, (cl_def.attribute & SyntaxTree.class_attribute.Partial) == SyntaxTree.class_attribute.Partial, cl_def.attribute); else - ctn = context.advanced_create_type(td.type_name.name, get_location(td.type_name), (td.type_def as class_definition).keyword == class_keyword.Interface, (cl_def.attribute & SyntaxTree.class_attribute.Partial) == SyntaxTree.class_attribute.Partial); + ctn = context.advanced_create_type(td.type_name.name, get_location(td.type_name), (td.type_def as class_definition).keyword == class_keyword.Interface, (cl_def.attribute & SyntaxTree.class_attribute.Partial) == SyntaxTree.class_attribute.Partial, cl_def.attribute); ctn.ForwardDeclarationOnly = true; if ((td.type_def as class_definition).keyword == class_keyword.Interface) ctn.IsInterface = true; @@ -11953,7 +11953,7 @@ namespace PascalABCCompiler.TreeConverter //(ssyy) Флаг показывает, создаём ли мы интерфейс bool interface_creating = (cl_def.keyword == PascalABCCompiler.SyntaxTree.class_keyword.Interface); - common_type_node ctn = context.advanced_create_type(_type_declaration.type_name.name, get_location(_type_declaration.type_name), interface_creating, (cl_def.attribute & SyntaxTree.class_attribute.Partial) == SyntaxTree.class_attribute.Partial); + common_type_node ctn = context.advanced_create_type(_type_declaration.type_name.name, get_location(_type_declaration.type_name), interface_creating, (cl_def.attribute & SyntaxTree.class_attribute.Partial) == SyntaxTree.class_attribute.Partial, cl_def.attribute); assign_doc_info(ctn,_type_declaration); if (_type_declaration.attributes != null) { diff --git a/bin/Lng/Eng/SemanticErrors_ib.dat b/bin/Lng/Eng/SemanticErrors_ib.dat index 0e42d1e5d..5fce29771 100644 --- a/bin/Lng/Eng/SemanticErrors_ib.dat +++ b/bin/Lng/Eng/SemanticErrors_ib.dat @@ -164,6 +164,7 @@ STATIC_CLASS_CAN_NOT_BE_USED_AS_PARENT_SPECIFICATOR=Static classes can not be us ENUM_MUST_HAVE_SEQUENCED_VALUES=Enum must have sequenced values EXTERNAL_METHOD_CANNOT_BE_NESTED=Nested functions cannot be external CANNOT_USE_RESERVED_ACCESSOR_NAMES=Can not declare class members with name reserved for property accessors +PARTIAL_CLASS_ATTRIBUTES_MISMATCH=Mismatch of partial class attributes %PREFIX%=COMPILATIONERROR_ UNIT_MODULE_EXPECTED_LIBRARY_FOUND=Unit expected, library found ASSEMBLY_{0}_READING_ERROR=Error by reading assembly '{0}' diff --git a/bin/Lng/Rus/SemanticErrors_ib.dat b/bin/Lng/Rus/SemanticErrors_ib.dat index 7f0a52fd4..904d711ea 100644 --- a/bin/Lng/Rus/SemanticErrors_ib.dat +++ b/bin/Lng/Rus/SemanticErrors_ib.dat @@ -159,6 +159,7 @@ STATIC_CLASS_CAN_NOT_BE_USED_AS_PARENT_SPECIFICATOR=Нельзя использ ENUM_MUST_HAVE_SEQUENCED_VALUES=Нельзя использовать пронумерованные перечисления в качестве индексатора массива EXTERNAL_METHOD_CANNOT_BE_NESTED=external-подпрограммы не могут вложенными CANNOT_USE_RESERVED_ACCESSOR_NAMES=Нельзя опеределять член класса с таким именем, так как оно зарезервировано для акцессора свойства +PARTIAL_CLASS_ATTRIBUTES_MISMATCH=Несоответствие атрибутов partial-класса %PREFIX%=COMPILATIONERROR_ UNIT_MODULE_EXPECTED_LIBRARY_FOUND=Ожидался модуль, а встречена библиотека ASSEMBLY_{0}_READING_ERROR=Ошибка при чтении сборки '{0}' diff --git a/bin/Lng/Ukr/SemanticErrors_ib.dat b/bin/Lng/Ukr/SemanticErrors_ib.dat index 9a1ffa548..c5e6b3cf9 100644 --- a/bin/Lng/Ukr/SemanticErrors_ib.dat +++ b/bin/Lng/Ukr/SemanticErrors_ib.dat @@ -156,6 +156,7 @@ STATIC_CLASS_CAN_NOT_BE_USED_AS_PARENT_SPECIFICATOR=Нельзя использ ENUM_MUST_HAVE_SEQUENCED_VALUES=Нельзя использовать пронумерованные перечисления в качестве индексатора массива EXTERNAL_METHOD_CANNOT_BE_NESTED=external-подпрограммы не могут вложенными CANNOT_USE_RESERVED_ACCESSOR_NAMES=Нельзя опеределять член класса с таким именем, так как оно зарезервировано для акцессора свойства +PARTIAL_CLASS_ATTRIBUTES_MISMATCH=Несоответствие атрибутов partial-класса %PREFIX%=COMPILATIONERROR_ UNIT_MODULE_EXPECTED_LIBRARY_FOUND=Очікувався модуль, а зустріли бібліотеку ASSEMBLY_{0}_READING_ERROR=Помилка при читанні збірки '{0}'