[flang-commits] [flang] [flang][OpenMP] improve semantic check for invalid goto (PR #144040)
Tom Eccles via flang-commits
flang-commits at lists.llvm.org
Fri Jun 13 02:54:20 PDT 2025
https://github.com/tblah updated https://github.com/llvm/llvm-project/pull/144040
>From 0bd007ac424e245050f874e3e3cbc71cb76b763b Mon Sep 17 00:00:00 2001
From: Tom Eccles <tom.eccles at arm.com>
Date: Thu, 12 Jun 2025 16:18:11 +0000
Subject: [PATCH] [flang][OpenMP] improve semantic check for invalid goto
Fixes #143229
---
flang/lib/Semantics/resolve-directives.cpp | 8 ++++++--
.../Semantics/OpenMP/parallel-master-goto.f90 | 15 +++++++++++++++
2 files changed, 21 insertions(+), 2 deletions(-)
create mode 100644 flang/test/Semantics/OpenMP/parallel-master-goto.f90
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..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
More information about the flang-commits
mailing list