[flang] When computing the stack of scopes, a label on the first statement
authorEric <eschweitz@nvidia.com>
Sat, 23 Mar 2019 02:20:16 +0000 (19:20 -0700)
committerEric <eschweitz@nvidia.com>
Sat, 23 Mar 2019 02:29:00 +0000 (19:29 -0700)
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

index b731c98..b56bb51 100644 (file)
@@ -221,8 +221,23 @@ public:
   template<typename A> bool Pre(const parser::Statement<A> &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<A, parser::AssociateStmt> ||
+          std::is_same_v<A, parser::BlockStmt> ||
+          std::is_same_v<A, parser::ChangeTeamStmt> ||
+          std::is_same_v<A, parser::CriticalStmt> ||
+          std::is_same_v<A, parser::NonLabelDoStmt> ||
+          std::is_same_v<A, parser::IfThenStmt> ||
+          std::is_same_v<A, parser::SelectCaseStmt> ||
+          std::is_same_v<A, parser::SelectRankStmt> ||
+          std::is_same_v<A, parser::SelectTypeStmt>) {
+        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{