diff --git a/flang/lib/Semantics/resolve-labels.cpp b/flang/lib/Semantics/resolve-labels.cpp --- a/flang/lib/Semantics/resolve-labels.cpp +++ b/flang/lib/Semantics/resolve-labels.cpp @@ -374,6 +374,12 @@ std::get>(blockData.t)); } + bool Pre(const parser::InterfaceBody &) { + PushDisposableMap(); + return true; + } + void Post(const parser::InterfaceBody &) { PopDisposableMap(); } + // C1564 void Post(const parser::InterfaceBody::Function &func) { CheckOptionalName("FUNCTION", func, @@ -492,10 +498,15 @@ } // C739 + bool Pre(const parser::DerivedTypeDef &) { + PushDisposableMap(); + return true; + } void Post(const parser::DerivedTypeDef &derivedTypeDef) { CheckOptionalName("derived type definition", derivedTypeDef, std::get>(derivedTypeDef.t)); + PopDisposableMap(); } void Post(const parser::LabelDoStmt &labelDoStmt) { @@ -779,7 +790,10 @@ LabeledStmtClassificationSet labeledStmtClassificationSet, ProxyForScope scope, bool isExecutableConstructEndStmt = false) { CheckLabelInRange(label); - const auto pair{programUnits_.back().targetStmts.emplace(label, + TargetStmtMap &targetStmtMap{disposableMaps_.empty() + ? programUnits_.back().targetStmts + : disposableMaps_.back()}; + const auto pair{targetStmtMap.emplace(label, LabeledStatementInfoTuplePOD{scope, currentPosition_, labeledStmtClassificationSet, isExecutableConstructEndStmt})}; if (!pair.second) { @@ -818,11 +832,19 @@ } } + void PushDisposableMap() { disposableMaps_.emplace_back(); } + void PopDisposableMap() { disposableMaps_.pop_back(); } + std::vector programUnits_; SemanticsContext &context_; parser::CharBlock currentPosition_; ProxyForScope currentScope_; std::vector constructNames_; + // For labels in derived type definitions and procedure + // interfaces, which are their own inclusive scopes. None + // of these labels can be used as a branch target, but they + // should be pairwise distinct. + std::vector disposableMaps_; }; bool InInclusiveScope(const std::vector &scopes, ProxyForScope tail, diff --git a/flang/test/Semantics/label17.f90 b/flang/test/Semantics/label17.f90 new file mode 100644 --- /dev/null +++ b/flang/test/Semantics/label17.f90 @@ -0,0 +1,38 @@ +! RUN: %python %S/test_errors.py %s %flang_fc1 +1 program main +1 type one +2 real x +3 end type one +1 type two +2 real x + !ERROR: Label '2' is not distinct +2 real y +3 end type two +2 interface +2 subroutine sub1(p, q) +3 interface +3 subroutine p +4 end subroutine +3 subroutine q +4 end subroutine +4 end interface +5 end subroutine +2 subroutine sub2(p, q) +3 interface +3 subroutine p +4 end subroutine +3 subroutine q +4 end subroutine +4 end interface +5 end subroutine +3 end interface +4 call sub3 +5 contains +1 subroutine sub3 +2 continue +3 block + !ERROR: Label '2' is not distinct +2 continue +4 end block +5 end subroutine +6 end program