From b027f6cf2b566dc85afd7fb4eea38f49ae651290 Mon Sep 17 00:00:00 2001 From: Eric Date: Fri, 22 Mar 2019 19:20:16 -0700 Subject: [PATCH] [flang] When computing the stack of scopes, a label on the first statement that begins a construct should be considered as in the parent scope rather that within the scope of the construct that is being entered. Original-commit: flang-compiler/f18@93da3538bcd31b165535dadefe4d67ee81a42ad9 Reviewed-on: https://github.com/flang-compiler/f18/pull/353 --- flang/lib/semantics/resolve-labels.cc | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/flang/lib/semantics/resolve-labels.cc b/flang/lib/semantics/resolve-labels.cc index b731c98..b56bb51 100644 --- a/flang/lib/semantics/resolve-labels.cc +++ b/flang/lib/semantics/resolve-labels.cc @@ -221,8 +221,23 @@ public: template bool Pre(const parser::Statement &statement) { currentPosition_ = statement.source; if (statement.label.has_value()) { - AddTargetLabelDefinition( - statement.label.value(), ConstructBranchTargetFlags(statement)); + auto label{statement.label.value()}; + auto targetFlags{ConstructBranchTargetFlags(statement)}; + if constexpr (std::is_same_v || + std::is_same_v || + std::is_same_v || + std::is_same_v || + std::is_same_v || + std::is_same_v || + std::is_same_v || + std::is_same_v || + std::is_same_v) { + constexpr bool useParent{true}; + AddTargetLabelDefinition(useParent, label, targetFlags); + } else { + constexpr bool useParent{false}; + AddTargetLabelDefinition(useParent, label, targetFlags); + } } return true; } @@ -502,6 +517,9 @@ private: void PopScope() { currentScope_ = programUnits_.back().scopeModel[currentScope_]; } + ProxyForScope ParentScope() { + return programUnits_.back().scopeModel[currentScope_]; + } bool SwitchToNewScope() { PopScope(); return PushSubscope(); @@ -718,12 +736,13 @@ private: } // 6.2.5., paragraph 2 - void AddTargetLabelDefinition(parser::Label label, + void AddTargetLabelDefinition(bool useParent, parser::Label label, LabeledStmtClassificationSet labeledStmtClassificationSet) { CheckLabelInRange(label); const auto pair{programUnits_.back().targetStmts.emplace(label, LabeledStatementInfoTuplePOD{ - currentScope_, currentPosition_, labeledStmtClassificationSet})}; + (useParent ? ParentScope() : currentScope_), currentPosition_, + labeledStmtClassificationSet})}; if (!pair.second) { errorHandler_.Say(currentPosition_, parser::MessageFormattedText{ -- 2.7.4