[flang-commits] [flang] d7784a6 - [flang][OpenMP] Catch threadprivate common block vars that appear in equivalence (#127642)
via flang-commits
flang-commits at lists.llvm.org
Thu Feb 20 03:17:33 PST 2025
Author: Leandro Lupori
Date: 2025-02-20T08:17:29-03:00
New Revision: d7784a649e80d346ba57ccc39f5e2a3e2f7e0a51
URL: https://github.com/llvm/llvm-project/commit/d7784a649e80d346ba57ccc39f5e2a3e2f7e0a51
DIFF: https://github.com/llvm/llvm-project/commit/d7784a649e80d346ba57ccc39f5e2a3e2f7e0a51.diff
LOG: [flang][OpenMP] Catch threadprivate common block vars that appear in equivalence (#127642)
Semantics were not checking for variables appearing in equivalence
statements when those were part of a threadprivate common block.
Fixes #122825
Added:
Modified:
flang/lib/Semantics/check-omp-structure.cpp
flang/test/Semantics/OpenMP/threadprivate02.f90
Removed:
################################################################################
diff --git a/flang/lib/Semantics/check-omp-structure.cpp b/flang/lib/Semantics/check-omp-structure.cpp
index 49e507feab580..ef7204dcd9196 100644
--- a/flang/lib/Semantics/check-omp-structure.cpp
+++ b/flang/lib/Semantics/check-omp-structure.cpp
@@ -1477,7 +1477,20 @@ void OmpStructureChecker::CheckThreadprivateOrDeclareTargetVar(
}
}
},
- [&](const parser::Name &) {}, // common block
+ [&](const parser::Name &name) {
+ if (name.symbol) {
+ if (auto *cb{name.symbol->detailsIf<CommonBlockDetails>()}) {
+ for (const auto &obj : cb->objects()) {
+ if (FindEquivalenceSet(*obj)) {
+ context_.Say(name.source,
+ "A variable in a %s directive cannot appear in an EQUIVALENCE statement (variable '%s' from common block '/%s/')"_err_en_US,
+ ContextDirectiveAsFortran(), obj->name(),
+ name.symbol->name());
+ }
+ }
+ }
+ }
+ },
},
ompObject.u);
}
diff --git a/flang/test/Semantics/OpenMP/threadprivate02.f90 b/flang/test/Semantics/OpenMP/threadprivate02.f90
index 7f6e8dcc8e8ab..9dc031a8ce47e 100644
--- a/flang/test/Semantics/OpenMP/threadprivate02.f90
+++ b/flang/test/Semantics/OpenMP/threadprivate02.f90
@@ -7,6 +7,9 @@ program threadprivate02
integer :: arr1(10)
common /blk1/ a1
real, save :: eq_a, eq_b, eq_c, eq_d
+ integer :: eq_e, eq_f
+ equivalence(eq_e, eq_f)
+ common /blk2/ eq_e
!$omp threadprivate(arr1)
@@ -25,6 +28,9 @@ program threadprivate02
!$omp threadprivate(eq_c)
equivalence(eq_c, eq_d)
+ !ERROR: A variable in a THREADPRIVATE directive cannot appear in an EQUIVALENCE statement (variable 'eq_e' from common block '/blk2/')
+ !$omp threadprivate(/blk2/)
+
contains
subroutine func()
integer :: arr2(10)
More information about the flang-commits
mailing list