-
Notifications
You must be signed in to change notification settings - Fork 14.3k
[flang][OpenMP] improve semantic check for invalid goto #144040
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
@llvm/pr-subscribers-flang-semantics @llvm/pr-subscribers-flang-openmp Author: Tom Eccles (tblah) ChangesFixes #143229 Full diff: https://github.com/llvm/llvm-project/pull/144040.diff 2 Files Affected:
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
|
1aa2128
to
0bd007a
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM
LLVM Buildbot has detected a new failure on builder Full details are available at: https://lab.llvm.org/buildbot/#/builders/157/builds/30710 Here is the relevant piece of the build log for the reference
|
Fixes #143229