From e7814c0f9f0eeba7f722e1c7b67c15b3b83ffa2e Mon Sep 17 00:00:00 2001 From: Mikhalkovich Stanislav Date: Fri, 19 Jun 2020 23:32:44 +0300 Subject: [PATCH] fix #2254 --- TestSuite/errors/err0370_where_override.pas | 20 +++++++++++++++++++ .../TreeConversion/syntax_tree_visitor.cs | 4 +++- bin/Lng/Eng/SemanticErrors_ms.dat | 4 +++- bin/Lng/Rus/SemanticErrors_ms.dat | 3 ++- bin/Lng/Rus/SemanticErrors_ssyy.dat | 2 +- 5 files changed, 29 insertions(+), 4 deletions(-) create mode 100644 TestSuite/errors/err0370_where_override.pas diff --git a/TestSuite/errors/err0370_where_override.pas b/TestSuite/errors/err0370_where_override.pas new file mode 100644 index 000000000..17e0f5eae --- /dev/null +++ b/TestSuite/errors/err0370_where_override.pas @@ -0,0 +1,20 @@ +type + t1 = class + procedure p1; virtual; + where TTT: constructor; + begin + end; + end; + + t2 = class(t1) + procedure p1; override; + where T: record, constructor; + begin + //Assert(typeof(T).IsValueType); + end; + end; + +begin + var a: t1 := new t2; + a.p1&; +end. \ No newline at end of file diff --git a/TreeConverter/TreeConversion/syntax_tree_visitor.cs b/TreeConverter/TreeConversion/syntax_tree_visitor.cs index 26f091a57..59a06a58f 100644 --- a/TreeConverter/TreeConversion/syntax_tree_visitor.cs +++ b/TreeConverter/TreeConversion/syntax_tree_visitor.cs @@ -13775,7 +13775,9 @@ namespace PascalABCCompiler.TreeConverter cmn.polymorphic_state = SemanticTree.polymorphic_state.ps_virtual_abstract; } - + if (is_override && _procedure_attributes_list.Parent is procedure_header ph && ph.where_defs != null) + AddError(cmn.loc, "OVERRIDE_METHODS_CANNOT_CONTAIN_WHERE_SECTION"); + if (cmn.field_access_level < cmn.overrided_method.field_access_level) AddError(cmn.loc, "CAN_NOT_BE_DOWN_ACCESS_LEVEL_FOR_METH"); break; diff --git a/bin/Lng/Eng/SemanticErrors_ms.dat b/bin/Lng/Eng/SemanticErrors_ms.dat index 44c849e4b..8a1f15388 100644 --- a/bin/Lng/Eng/SemanticErrors_ms.dat +++ b/bin/Lng/Eng/SemanticErrors_ms.dat @@ -36,4 +36,6 @@ LAMBDAS_IN_CONSTRUCTOR_PARAMETERS_ARE_FORBIDDEN_IN_THIS_CONTEXT=Lambda-expressio PROCEDURE_TYPE_SHOULD_BE_REPLACED_BY_TYPE_NAME_IN_THIS_CONTEXT=Procedure type should be replaced by type name in this context ACCESS_TO_ENUM_CONST_THROUGH_OBJECT=Enum constant can not be accessed through an object 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 \ No newline at end of file +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 diff --git a/bin/Lng/Rus/SemanticErrors_ms.dat b/bin/Lng/Rus/SemanticErrors_ms.dat index d9d793840..2ba84115b 100644 --- a/bin/Lng/Rus/SemanticErrors_ms.dat +++ b/bin/Lng/Rus/SemanticErrors_ms.dat @@ -37,4 +37,5 @@ LAMBDAS_IN_CONSTRUCTOR_PARAMETERS_ARE_FORBIDDEN_IN_THIS_CONTEXT=Лямбда-в PROCEDURE_TYPE_SHOULD_BE_REPLACED_BY_TYPE_NAME_IN_THIS_CONTEXT=Процедурный тип следует заменить именем типа в данном контексте ACCESS_TO_ENUM_CONST_THROUGH_OBJECT=Нельзя обратиться к элементу перечисления через объект ONE_DIM_ARRAY_OR_LIST_EXPECTED=Ожидался одномерный массив или список -TUPLE_TYPE_ELEMENTS_COUNT_MUST_BE_LESSEQUAL_7=Количество элементов в типе кортежа не должно быть больше 7 \ No newline at end of file +TUPLE_TYPE_ELEMENTS_COUNT_MUST_BE_LESSEQUAL_7=Количество элементов в типе кортежа не должно быть больше 7 +OVERRIDE_METHODS_CANNOT_CONTAIN_WHERE_SECTION=Методы с модификатором override не могут содержать собственную секцию where \ No newline at end of file diff --git a/bin/Lng/Rus/SemanticErrors_ssyy.dat b/bin/Lng/Rus/SemanticErrors_ssyy.dat index 05e839774..62e14d788 100644 --- a/bin/Lng/Rus/SemanticErrors_ssyy.dat +++ b/bin/Lng/Rus/SemanticErrors_ssyy.dat @@ -12,7 +12,7 @@ CONSTRUCTOR_IN_INTERFACE=Интерфейс не может содержать INTERFACE_{0}_CONSTRUCTOR_CALL={0} является интерфейсом, невозможно создать его экземпляр CLASS_{0}_DOES_NOT_IMPLEMENT_MEMBER_{2}_OF_INTERFACE_{1}=Класс {0} не реализует метод {2} интерфейса {1} MEMBER_{2}_OF_CLASS_{0}_FROM_INTERFACE_{1}_MUST_BE_PUBLIC_AND_NON_STATIC=Функция класса {0}, реализующая метод {2} интерфейса {1}, должна быть нестатической с уровнем доступа public -ATTRIBUTES_IN_INTERFACE_MEMBER=Данный аттрибуты недопустим в интерфейсе +ATTRIBUTES_IN_INTERFACE_MEMBER=Данный атрибут недопустим в интерфейсе MODIFER_BLOCK_{0}_CALL=Член {0} закрыт своим модификатором видимости LEFT_RANGE_GREATER_THEN_RIGHT=Нижняя граница превосходит верхнюю ACCESS_MODIFER_IN_INTERFACE=Модификаторы видимости недопустимы внутри интерфейса