[flang-commits] [flang] [flang][OpenMP] improve semantic check for invalid goto (PR #144040)
via flang-commits
flang-commits at lists.llvm.org
Fri Jun 13 02:33:51 PDT 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-flang-openmp
Author: Tom Eccles (tblah)
<details>
<summary>Changes</summary>
Fixes #<!-- -->143229
---
Full diff: https://github.com/llvm/llvm-project/pull/144040.diff
2 Files Affected:
- (modified) flang/lib/Semantics/resolve-directives.cpp (+6-2)
- (added) flang/test/Semantics/OpenMP/parallel-master-goto.f90 (+15)
``````````diff
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<DirContext> sourceContext,
std::optional<DirContext> 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..3e57fd7ec8902
--- /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
+!ERROR: OpenMP directive MASTER has been deprecated, please use MASKED instead.
+!$omp master
+10 print *, i
+!$omp end master
+!$omp end parallel
+end
``````````
</details>
https://github.com/llvm/llvm-project/pull/144040
More information about the flang-commits
mailing list