diff --git a/TestSuite/errors/err0314.pas b/TestSuite/errors/err0314.pas new file mode 100644 index 000000000..f048ddc7d --- /dev/null +++ b/TestSuite/errors/err0314.pas @@ -0,0 +1,12 @@ +type + e1 = ( + ef1 = 2, + ef2 = 4, + ef3 = 8 + ); + +begin + var a: array[e1] of byte; + a[ef2] := 4; + readln; +end. \ No newline at end of file diff --git a/TreeConverter/TreeConversion/syntax_tree_visitor.cs b/TreeConverter/TreeConversion/syntax_tree_visitor.cs index 30f85ecc5..77988350e 100644 --- a/TreeConverter/TreeConversion/syntax_tree_visitor.cs +++ b/TreeConverter/TreeConversion/syntax_tree_visitor.cs @@ -14071,6 +14071,24 @@ namespace PascalABCCompiler.TreeConverter { AddError(new OrdinalTypeExpected(get_location(td))); } + if (tn.IsEnum && tn is common_type_node) + { + common_type_node enum_ctn = tn as common_type_node; + int c = 0; + for (int i = 0; i < enum_ctn.const_defs.Count; i++) + { + class_constant_definition ccdn = enum_ctn.const_defs[i]; + if (ccdn.constant_value != null) + { + int nextc = Convert.ToInt32(ccdn.constant_value.value); + if (nextc - c != 1 && i != 0) + AddError(get_location(td), "ENUM_MUST_HAVE_SEQUENCED_VALUES"); + else if (nextc != 0 && i == 0) + AddError(get_location(td), "ENUM_MUST_HAVE_SEQUENCED_VALUES"); + c = nextc; + } + } + } if (tn.type_special_kind == SemanticTree.type_special_kind.diap_type) { if (tn.base_type == SystemLibrary.SystemLibrary.uint_type || tn.base_type == SystemLibrary.SystemLibrary.int64_type || diff --git a/bin/Lng/Eng/SemanticErrors_ib.dat b/bin/Lng/Eng/SemanticErrors_ib.dat index 026f20919..9e4327f80 100644 --- a/bin/Lng/Eng/SemanticErrors_ib.dat +++ b/bin/Lng/Eng/SemanticErrors_ib.dat @@ -161,6 +161,7 @@ CANNOT_GET_POINTER_TO_DISPOSE=Cannot get a pointer to intrinsic procedure Dispos USING_{0}_NOT_ALLOWED_IN_THIS_CONTEXT=Using of {0} is not allowed in this context OPERATORS_IN_INTERFACES_NOT_ALLOWED=Interfaces can not contain operators STATIC_CLASS_CAN_NOT_BE_USED_AS_PARENT_SPECIFICATOR=Static classes can not be used as generic constraints +ENUM_MUST_HAVE_SEQUENCED_VALUES=Enum must have sequenced values %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 c57d28ab0..e113920a8 100644 --- a/bin/Lng/Rus/SemanticErrors_ib.dat +++ b/bin/Lng/Rus/SemanticErrors_ib.dat @@ -156,6 +156,7 @@ CANNOT_GET_POINTER_TO_DISPOSE=Нельзя получить указатель USING_{0}_NOT_ALLOWED_IN_THIS_CONTEXT=Использование {0} недопустимо в данном контексте OPERATORS_IN_INTERFACES_NOT_ALLOWED=Интерфейсы не могут содержать операторы STATIC_CLASS_CAN_NOT_BE_USED_AS_PARENT_SPECIFICATOR=Нельзя использовать статические классы в качестве ограничений +ENUM_MUST_HAVE_SEQUENCED_VALUES=Нельзя использовать пронумерованные перечисления в качестве индексатора массива %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 356d7f98d..af40212fc 100644 --- a/bin/Lng/Ukr/SemanticErrors_ib.dat +++ b/bin/Lng/Ukr/SemanticErrors_ib.dat @@ -153,6 +153,7 @@ CANNOT_GET_POINTER_TO_DISPOSE=Нельзя получить указатель USING_{0}_NOT_ALLOWED_IN_THIS_CONTEXT=Использование {0} недопустимо в данном контексте OPERATORS_IN_INTERFACES_NOT_ALLOWED=Интерфейсы не могут содержать операторы STATIC_CLASS_CAN_NOT_BE_USED_AS_PARENT_SPECIFICATOR=Нельзя использовать статические классы в качестве ограничений +ENUM_MUST_HAVE_SEQUENCED_VALUES=Нельзя использовать пронумерованные перечисления в качестве индексатора массива %PREFIX%=COMPILATIONERROR_ UNIT_MODULE_EXPECTED_LIBRARY_FOUND=Очікувався модуль, а зустріли бібліотеку ASSEMBLY_{0}_READING_ERROR=Помилка при читанні збірки '{0}'