From a0ac0a1a3ad54b882baeb30b26ac08e74907232a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=91=D0=BE=D0=BD=D0=B4=D0=B0=D1=80=D0=B5=D0=B2=20=D0=98?= =?UTF-8?q?=D0=B2=D0=B0=D0=BD?= Date: Sun, 18 Aug 2019 13:56:13 +0200 Subject: [PATCH] fix #2075 --- TestSuite/errors/err0338_nested_external_function.pas | 10 ++++++++++ TreeConverter/TreeConversion/syntax_tree_visitor.cs | 2 ++ bin/Lng/Eng/SemanticErrors_ib.dat | 1 + bin/Lng/Rus/SemanticErrors_ib.dat | 1 + bin/Lng/Ukr/SemanticErrors_ib.dat | 1 + 5 files changed, 15 insertions(+) create mode 100644 TestSuite/errors/err0338_nested_external_function.pas diff --git a/TestSuite/errors/err0338_nested_external_function.pas b/TestSuite/errors/err0338_nested_external_function.pas new file mode 100644 index 000000000..be0f27afd --- /dev/null +++ b/TestSuite/errors/err0338_nested_external_function.pas @@ -0,0 +1,10 @@ +procedure p1; + function GetDC(hwnd: System.IntPtr): System.IntPtr; + external 'user32.dll'; +begin + GetDC(System.IntPtr.Zero); +end; + +begin + 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 7a3c4183b..e5bc15cfa 100644 --- a/TreeConverter/TreeConversion/syntax_tree_visitor.cs +++ b/TreeConverter/TreeConversion/syntax_tree_visitor.cs @@ -17317,6 +17317,8 @@ namespace PascalABCCompiler.TreeConverter { string module_name = ""; string name = ""; + if (context.converted_func_stack.size > 1) + AddError(context.top_function.loc, "EXTERNAL_METHOD_CANNOT_BE_NESTED"); if (context.converted_func_stack.top() is common_method_node && (context.converted_func_stack.top() as common_method_node).polymorphic_state != SemanticTree.polymorphic_state.ps_static) AddError(context.top_function.loc, "EXTERNAL_METHOD_SHOULD_BE_STATIC"); if (context.converted_func_stack.top().is_generic_function) diff --git a/bin/Lng/Eng/SemanticErrors_ib.dat b/bin/Lng/Eng/SemanticErrors_ib.dat index 9e4327f80..2852f4c3e 100644 --- a/bin/Lng/Eng/SemanticErrors_ib.dat +++ b/bin/Lng/Eng/SemanticErrors_ib.dat @@ -162,6 +162,7 @@ USING_{0}_NOT_ALLOWED_IN_THIS_CONTEXT=Using of {0} is not allowed in this contex 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 +EXTERNAL_METHOD_CANNOT_BE_NESTED=Nested functions cannot be external %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 e113920a8..02b7c7a21 100644 --- a/bin/Lng/Rus/SemanticErrors_ib.dat +++ b/bin/Lng/Rus/SemanticErrors_ib.dat @@ -157,6 +157,7 @@ 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=Нельзя использовать пронумерованные перечисления в качестве индексатора массива +EXTERNAL_METHOD_CANNOT_BE_NESTED=external-подпрограммы не могут вложенными %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 af40212fc..d6c240749 100644 --- a/bin/Lng/Ukr/SemanticErrors_ib.dat +++ b/bin/Lng/Ukr/SemanticErrors_ib.dat @@ -154,6 +154,7 @@ 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=Нельзя использовать пронумерованные перечисления в качестве индексатора массива +EXTERNAL_METHOD_CANNOT_BE_NESTED=external-подпрограммы не могут вложенными %PREFIX%=COMPILATIONERROR_ UNIT_MODULE_EXPECTED_LIBRARY_FOUND=Очікувався модуль, а зустріли бібліотеку ASSEMBLY_{0}_READING_ERROR=Помилка при читанні збірки '{0}'