[flang-commits] [flang] [Flang][OpenMP] Fix issue with named constants in SHARED and FIRSTPRIVATE clauses (PR #154335)
Michael Klemm via flang-commits
flang-commits at lists.llvm.org
Tue Aug 19 08:04:23 PDT 2025
https://github.com/mjklemm updated https://github.com/llvm/llvm-project/pull/154335
>From 9fd70ac26c725b405ad75e98c9524e0aa9e77919 Mon Sep 17 00:00:00 2001
From: Michael Klemm <michael.klemm at amd.com>
Date: Mon, 18 Aug 2025 23:13:01 +0200
Subject: [PATCH 1/2] [Flang][OpenMP] Fix issue with named constants not being
allowed in shared and firstprivate
---
flang/include/flang/Semantics/openmp-utils.h | 1 +
flang/lib/Semantics/check-omp-structure.cpp | 15 ++++++-
flang/lib/Semantics/openmp-utils.cpp | 4 ++
.../test/Semantics/OpenMP/named-constants.f90 | 44 +++++++++++++++++++
4 files changed, 63 insertions(+), 1 deletion(-)
create mode 100644 flang/test/Semantics/OpenMP/named-constants.f90
diff --git a/flang/include/flang/Semantics/openmp-utils.h b/flang/include/flang/Semantics/openmp-utils.h
index 1c54124a5738a..df09e7a9e24b5 100644
--- a/flang/include/flang/Semantics/openmp-utils.h
+++ b/flang/include/flang/Semantics/openmp-utils.h
@@ -65,6 +65,7 @@ std::optional<parser::CharBlock> GetObjectSource(
bool IsCommonBlock(const Symbol &sym);
bool IsExtendedListItem(const Symbol &sym);
bool IsVariableListItem(const Symbol &sym);
+bool IsNamedConstantListItem(const Symbol &sym);
bool IsVarOrFunctionRef(const MaybeExpr &expr);
bool IsMapEnteringType(parser::OmpMapType::Value type);
diff --git a/flang/lib/Semantics/check-omp-structure.cpp b/flang/lib/Semantics/check-omp-structure.cpp
index d9092565449da..5c3e6cad79c95 100644
--- a/flang/lib/Semantics/check-omp-structure.cpp
+++ b/flang/lib/Semantics/check-omp-structure.cpp
@@ -2561,11 +2561,24 @@ void OmpStructureChecker::Enter(const parser::OmpClause &x) {
break;
}
+ // Named constants are OK to be used within 'shared' and 'firstprivate'
+ // clauses. The check for this happens a few lines below.
+ bool SharedOrFirstprivate = false;
+ switch (x.Id()) {
+ case llvm::omp::Clause::OMPC_shared:
+ case llvm::omp::Clause::OMPC_firstprivate:
+ SharedOrFirstprivate = true;
+ break;
+ default:
+ break;
+ }
+
if (const parser::OmpObjectList *objList{GetOmpObjectList(x)}) {
SymbolSourceMap symbols;
GetSymbolsInObjectList(*objList, symbols);
for (const auto &[symbol, source] : symbols) {
- if (!IsVariableListItem(*symbol)) {
+ if (!IsVariableListItem(*symbol) &&
+ !(IsNamedConstantListItem(*symbol) && SharedOrFirstprivate)) {
deferredNonVariables_.insert({symbol, source});
}
}
diff --git a/flang/lib/Semantics/openmp-utils.cpp b/flang/lib/Semantics/openmp-utils.cpp
index e8df346ccdc3e..663814b440034 100644
--- a/flang/lib/Semantics/openmp-utils.cpp
+++ b/flang/lib/Semantics/openmp-utils.cpp
@@ -130,6 +130,10 @@ bool IsVariableListItem(const Symbol &sym) {
return evaluate::IsVariable(sym) || sym.attrs().test(Attr::POINTER);
}
+bool IsNamedConstantListItem(const Symbol &sym) {
+ return sym.attrs().test(Attr::PARAMETER);
+}
+
bool IsExtendedListItem(const Symbol &sym) {
return IsVariableListItem(sym) || sym.IsSubprogram();
}
diff --git a/flang/test/Semantics/OpenMP/named-constants.f90 b/flang/test/Semantics/OpenMP/named-constants.f90
new file mode 100644
index 0000000000000..ac0850066cebe
--- /dev/null
+++ b/flang/test/Semantics/OpenMP/named-constants.f90
@@ -0,0 +1,44 @@
+!RUN: %python %S/../test_errors.py %s %flang_fc1 -fopenmp
+
+module named_constants
+ implicit none
+contains
+ subroutine shrd()
+ implicit none
+ integer, parameter :: n = 7
+ real, parameter :: m = 7.0
+ logical, parameter :: l = .false.
+ integer, dimension(3), parameter :: a = [1, 2, 3]
+ ! no error expected
+ !$omp parallel shared(n, m, l, a)
+ print *, n, m, l, a
+ !$omp end parallel
+ end subroutine shrd
+
+ subroutine frstprvt()
+ implicit none
+ integer, parameter :: n = 7
+ real, parameter :: m = 7.0
+ logical, parameter :: l = .false.
+ integer, dimension(3), parameter :: a = [1, 2, 3]
+ ! no error expected
+ !$omp parallel firstprivate(n, m, l, a)
+ print *, n, m, l, a
+ !$omp end parallel
+ end subroutine frstprvt
+
+ subroutine prvt()
+ implicit none
+ integer, parameter :: n = 7
+ real, parameter :: m = 7.0
+ logical, parameter :: l = .false.
+ integer, dimension(3), parameter :: a = [1, 2, 3]
+ !ERROR: 'n' must be a variable
+ !ERROR: 'm' must be a variable
+ !ERROR: 'l' must be a variable
+ !ERROR: 'a' must be a variable
+ !$omp parallel private(n, m, l, a)
+ print *, n, m, l, a
+ !$omp end parallel
+ end subroutine prvt
+end module named_constants
>From 01d302a2074f1fd742d63d69a048e3af6d7225d8 Mon Sep 17 00:00:00 2001
From: Michael Klemm <michael.klemm at amd.com>
Date: Tue, 19 Aug 2025 17:03:20 +0200
Subject: [PATCH 2/2] Rename IsNamedConstantListItem to IsNamedConstant
---
flang/include/flang/Semantics/openmp-utils.h | 2 +-
flang/lib/Semantics/check-omp-structure.cpp | 2 +-
flang/lib/Semantics/openmp-utils.cpp | 2 +-
3 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/flang/include/flang/Semantics/openmp-utils.h b/flang/include/flang/Semantics/openmp-utils.h
index df09e7a9e24b5..e6e4bc4911a57 100644
--- a/flang/include/flang/Semantics/openmp-utils.h
+++ b/flang/include/flang/Semantics/openmp-utils.h
@@ -65,7 +65,7 @@ std::optional<parser::CharBlock> GetObjectSource(
bool IsCommonBlock(const Symbol &sym);
bool IsExtendedListItem(const Symbol &sym);
bool IsVariableListItem(const Symbol &sym);
-bool IsNamedConstantListItem(const Symbol &sym);
+bool IsNamedConstant(const Symbol &sym);
bool IsVarOrFunctionRef(const MaybeExpr &expr);
bool IsMapEnteringType(parser::OmpMapType::Value type);
diff --git a/flang/lib/Semantics/check-omp-structure.cpp b/flang/lib/Semantics/check-omp-structure.cpp
index 5c3e6cad79c95..42642581a22fb 100644
--- a/flang/lib/Semantics/check-omp-structure.cpp
+++ b/flang/lib/Semantics/check-omp-structure.cpp
@@ -2578,7 +2578,7 @@ void OmpStructureChecker::Enter(const parser::OmpClause &x) {
GetSymbolsInObjectList(*objList, symbols);
for (const auto &[symbol, source] : symbols) {
if (!IsVariableListItem(*symbol) &&
- !(IsNamedConstantListItem(*symbol) && SharedOrFirstprivate)) {
+ !(IsNamedConstant(*symbol) && SharedOrFirstprivate)) {
deferredNonVariables_.insert({symbol, source});
}
}
diff --git a/flang/lib/Semantics/openmp-utils.cpp b/flang/lib/Semantics/openmp-utils.cpp
index 663814b440034..a1c8cbe661e97 100644
--- a/flang/lib/Semantics/openmp-utils.cpp
+++ b/flang/lib/Semantics/openmp-utils.cpp
@@ -130,7 +130,7 @@ bool IsVariableListItem(const Symbol &sym) {
return evaluate::IsVariable(sym) || sym.attrs().test(Attr::POINTER);
}
-bool IsNamedConstantListItem(const Symbol &sym) {
+bool IsNamedConstant(const Symbol &sym) {
return sym.attrs().test(Attr::PARAMETER);
}
More information about the flang-commits
mailing list