diff --git a/flang/lib/Semantics/resolve-directives.cpp b/flang/lib/Semantics/resolve-directives.cpp index 93bf510fbc3c7..b5f8667fe36f2 100644 --- a/flang/lib/Semantics/resolve-directives.cpp +++ b/flang/lib/Semantics/resolve-directives.cpp @@ -3023,10 +3023,14 @@ void OmpAttributeVisitor::CheckSourceLabel(const parser::Label &label) { void OmpAttributeVisitor::CheckLabelContext(const parser::CharBlock source, const parser::CharBlock target, std::optional sourceContext, std::optional targetContext) { + auto dirContextsSame = [](DirContext &lhs, DirContext &rhs) -> bool { + // Sometimes nested constructs share a scope but are different contexts + return (lhs.scope == rhs.scope) && (lhs.directive == rhs.directive); + }; unsigned version{context_.langOptions().OpenMPVersion}; if (targetContext && (!sourceContext || - (sourceContext->scope != targetContext->scope && + (!dirContextsSame(*targetContext, *sourceContext) && !DoesScopeContain( &targetContext->scope, sourceContext->scope)))) { context_ @@ -3038,7 +3042,7 @@ void OmpAttributeVisitor::CheckLabelContext(const parser::CharBlock source, } if (sourceContext && (!targetContext || - (sourceContext->scope != targetContext->scope && + (!dirContextsSame(*sourceContext, *targetContext) && !DoesScopeContain( &sourceContext->scope, targetContext->scope)))) { context_ diff --git a/flang/test/Semantics/OpenMP/parallel-master-goto.f90 b/flang/test/Semantics/OpenMP/parallel-master-goto.f90 new file mode 100644 index 0000000000000..72c8002ab4c59 --- /dev/null +++ b/flang/test/Semantics/OpenMP/parallel-master-goto.f90 @@ -0,0 +1,15 @@ +! RUN: %python %S/../test_errors.py %s %flang -fopenmp +! Regression test for #143229 + +!$omp parallel +do i = 1, 2 +!ERROR: invalid branch into an OpenMP structured block +!ERROR: invalid branch leaving an OpenMP structured block + goto 10 +end do +!WARNING: OpenMP directive MASTER has been deprecated, please use MASKED instead. +!$omp master +10 print *, i +!$omp end master +!$omp end parallel +end