From 01eac975de794a0a269f8a55bcfe9fcbd1387dcb Mon Sep 17 00:00:00 2001 From: miks1965 Date: Sat, 11 Jun 2016 09:47:22 +0300 Subject: [PATCH] bug fix #199 --- PascalABCNET.axml | 33 +++++++++++++++++++ .../TreeConversion/syntax_tree_visitor.cs | 10 +++--- 2 files changed, 39 insertions(+), 4 deletions(-) diff --git a/PascalABCNET.axml b/PascalABCNET.axml index d67836fcb..bec9fd4d7 100644 --- a/PascalABCNET.axml +++ b/PascalABCNET.axml @@ -757,6 +757,39 @@ + + \yield\syntaxvisitors\yieldvisitors\processyieldscapturedvars.cs + function_header nfh = ObjectCopier.Clone(fh); + + type_declarations GenClassesForYield ( procedure_definition pd , IEnumerable < var_def_statement > fields , IDictionary < string , string > localsMap , IDictionary < string , string > formalParamsMap , IDictionary < var_def_statement , var_def_statement > localsCloneMap , yield_locals_type_map_helper localTypeMapHelper ) + public class ProcessYieldCapturedVarsVisitor : BaseChangeVisitor + namespace SyntaxVisitors + + + + + + \treeconverter\treeconversion\syntax_tree_visitor.cs + visit_program_code(_block.program_code); + + public override void visit ( SyntaxTree . block _block ) + public class syntax_tree_visitor : SyntaxTree . AbstractVisitor + namespace PascalABCCompiler . TreeConverter + + + + + + \treeconverter\treeconversion\syntax_tree_visitor.cs + if (lab.is_defined) + + public override void visit ( SyntaxTree . labeled_statement _labeled_statement ) + public class syntax_tree_visitor : SyntaxTree . AbstractVisitor + namespace PascalABCCompiler . TreeConverter + + + + \ No newline at end of file diff --git a/TreeConverter/TreeConversion/syntax_tree_visitor.cs b/TreeConverter/TreeConversion/syntax_tree_visitor.cs index bbd829a74..afee8b2ec 100644 --- a/TreeConverter/TreeConversion/syntax_tree_visitor.cs +++ b/TreeConverter/TreeConversion/syntax_tree_visitor.cs @@ -8308,10 +8308,12 @@ namespace PascalABCCompiler.TreeConverter { AddError(get_location(_labeled_statement.label_name), "IDENT_{0}_IS_NOT_LABEL", _labeled_statement.label_name.name); } - if (lab.is_defined) - { - AddError(get_location(_labeled_statement.label_name), "LABEL_{0}_REDEFINED", _labeled_statement.label_name.name); - } + // SSM - Patch повторного определения меток в подпрограммах при наличии лямбд + if (lambdaProcessingState != LambdaProcessingState.FinishPhase) + if (lab.is_defined) + { + AddError(get_location(_labeled_statement.label_name), "LABEL_{0}_REDEFINED", _labeled_statement.label_name.name); + } lab.is_defined = true; lab.comprehensive_code_block = context.block_stack.Peek(); foreach (goto_statement gs in lab.goto_statements)