From 75ef5777032b6ef8cbe7051d1e16e397952331d2 Mon Sep 17 00:00:00 2001 From: Mikhalkovich Stanislav Date: Fri, 21 Jun 2019 20:32:01 +0300 Subject: [PATCH] fix #1985 --- Configuration/GlobalAssemblyInfo.cs | 2 +- Configuration/Version.defs | 4 +-- Localization/DefaultLang.resources | Bin 90713 -> 90825 bytes ReleaseGenerators/PascalABCNET_version.nsh | 2 +- .../BaseVisitors/HasStatementVisitor.cs | 33 +++++++++++++++++- .../MarkMethodHasYieldVisitor.cs | 6 ++-- TestSuite/lock_in_lambda_in_yield.pas | 16 +++++++++ TestSuite/try_in_lambda_in_yield.pas | 15 ++++++++ 8 files changed, 71 insertions(+), 7 deletions(-) create mode 100644 TestSuite/lock_in_lambda_in_yield.pas create mode 100644 TestSuite/try_in_lambda_in_yield.pas diff --git a/Configuration/GlobalAssemblyInfo.cs b/Configuration/GlobalAssemblyInfo.cs index 5e459281e..fb791182f 100644 --- a/Configuration/GlobalAssemblyInfo.cs +++ b/Configuration/GlobalAssemblyInfo.cs @@ -15,7 +15,7 @@ internal static class RevisionClass public const string Major = "3"; public const string Minor = "5"; public const string Build = "0"; - public const string Revision = "2134"; + public const string Revision = "2135"; public const string MainVersion = Major + "." + Minor; public const string FullVersion = Major + "." + Minor + "." + Build + "." + Revision; diff --git a/Configuration/Version.defs b/Configuration/Version.defs index 00f46a84a..1400801e2 100644 --- a/Configuration/Version.defs +++ b/Configuration/Version.defs @@ -1,4 +1,4 @@ -%COREVERSION%=0 -%REVISION%=2134 %MINOR%=5 +%REVISION%=2135 +%COREVERSION%=0 %MAJOR%=3 diff --git a/Localization/DefaultLang.resources b/Localization/DefaultLang.resources index d66cafe07b5e01fdb1e1bef6bf5360e70da1c9dc..316bb8f10293b25e9433f74b40fd0ea6af613ade 100644 GIT binary patch delta 119 zcmV--0EqwD#0AO41(4tY<+0%%3Q|r%O+`~sK|@7fLqSeoLPcLgPfbusOhrUrPfko( zUrA11P*P7yMMG3mJ<9Iv@969Q_UQj0^x*01?&2WvAn)+*@$&HC?eX&B;Oyui= : BaseEnterExitVisitor + where T : statement + where Barrier: syntax_tree_node + { + private bool foundT = false; + + public static bool Has(syntax_tree_node node) + { + HasStatementWithBarrierVisitor vis = new HasStatementWithBarrierVisitor(); + + vis.ProcessNode(node); + + return vis.foundT; + } + + public override void Enter(syntax_tree_node sn) // Искать всюду, но не заходить в узлы Barrier и вложенные + { + if (sn is Barrier) + { + visitNode = false; + } + } + + public override void DefaultVisit(syntax_tree_node node) + { + if (node is T) + foundT = true; + else base.DefaultVisit(node); } } diff --git a/SyntaxVisitors/YieldVisitors/MarkMethodHasYieldVisitor.cs b/SyntaxVisitors/YieldVisitors/MarkMethodHasYieldVisitor.cs index 2b9dd28bb..7dedb81fb 100644 --- a/SyntaxVisitors/YieldVisitors/MarkMethodHasYieldVisitor.cs +++ b/SyntaxVisitors/YieldVisitors/MarkMethodHasYieldVisitor.cs @@ -100,12 +100,14 @@ namespace SyntaxVisitors throw new SyntaxVisitorError("FUNCTIONS_WITH_YIELDS_CANNOT_CONTAIN_NESTED_SUBROUTINES", pd.source_context); } - if (pd.has_yield && pd.DescendantNodes().OfType().Count() > 0) + if (pd.has_yield && HasStatementWithBarrierVisitor.Has(pd)) + //pd.DescendantNodes().OfType().Count() > 0) { throw new SyntaxVisitorError("FUNCTIONS_WITH_YIELDS_CANNOT_CONTAIN_TRY_EXCEPT_FINALLY", pd.source_context); } - if (pd.has_yield && pd.DescendantNodes().OfType().Count() > 0) + if (pd.has_yield && HasStatementWithBarrierVisitor.Has(pd)) + //pd.DescendantNodes().OfType().Count() > 0) { throw new SyntaxVisitorError("FUNCTIONS_WITH_YIELDS_CANNOT_CONTAIN_LOCK", pd.source_context); } diff --git a/TestSuite/lock_in_lambda_in_yield.pas b/TestSuite/lock_in_lambda_in_yield.pas new file mode 100644 index 000000000..f91850c4a --- /dev/null +++ b/TestSuite/lock_in_lambda_in_yield.pas @@ -0,0 +1,16 @@ +function f1: sequence of byte; //Ошибка: Функции с yield не могут содержать блоков try..except и try..finally +begin + yield 0; + + var p: procedure := ()-> + begin + lock(new object) do + begin + + end; + end; + +end; + +begin +end. \ No newline at end of file diff --git a/TestSuite/try_in_lambda_in_yield.pas b/TestSuite/try_in_lambda_in_yield.pas new file mode 100644 index 000000000..309406579 --- /dev/null +++ b/TestSuite/try_in_lambda_in_yield.pas @@ -0,0 +1,15 @@ +function f1: sequence of byte; //Ошибка: Функции с yield не могут содержать блоков try..except и try..finally +begin + yield 0; + + var p: procedure := ()-> + begin + try + except + end + end; + +end; + +begin +end. \ No newline at end of file