[flang-commits] [flang] [flang][OpenMP] Diagnose whole assumed-size arrays on two clauses (PR #172510)
Krzysztof Parzyszek via flang-commits
flang-commits at lists.llvm.org
Wed Dec 17 09:43:27 PST 2025
https://github.com/kparzysz updated https://github.com/llvm/llvm-project/pull/172510
>From 5711039824b5caa2d1e2e497663c24b2bda3ffc2 Mon Sep 17 00:00:00 2001
From: Krzysztof Parzyszek <Krzysztof.Parzyszek at amd.com>
Date: Tue, 16 Dec 2025 09:35:31 -0600
Subject: [PATCH] [flang][OpenMP] Diagnose whole assumed-size arrays on two
clauses
OpenMP 6.0 allows whole assumed-size arrays to appear as list items
in MAP and USE_DEVICE_ADDR clauses. This was not allowed in prior
spec versions.
---
flang/include/flang/Semantics/openmp-utils.h | 2 ++
flang/lib/Semantics/check-omp-structure.cpp | 25 +++++++++++++++++--
flang/lib/Semantics/openmp-utils.cpp | 7 ++++++
flang/lib/Semantics/resolve-directives.cpp | 6 -----
.../test/Semantics/OpenMP/map-clause-v60.f90 | 8 ++++++
flang/test/Semantics/OpenMP/map-clause.f90 | 2 +-
.../Semantics/OpenMP/use-device-addr-v60.f90 | 9 +++++++
.../Semantics/OpenMP/use_device_addr1.f90 | 6 ++++-
8 files changed, 55 insertions(+), 10 deletions(-)
create mode 100644 flang/test/Semantics/OpenMP/map-clause-v60.f90
create mode 100644 flang/test/Semantics/OpenMP/use-device-addr-v60.f90
diff --git a/flang/include/flang/Semantics/openmp-utils.h b/flang/include/flang/Semantics/openmp-utils.h
index 639f7224ddf6b..90fd36708de0e 100644
--- a/flang/include/flang/Semantics/openmp-utils.h
+++ b/flang/include/flang/Semantics/openmp-utils.h
@@ -76,6 +76,8 @@ bool IsTypeParamInquiry(const Symbol &sym);
bool IsStructureComponent(const Symbol &sym);
bool IsVarOrFunctionRef(const MaybeExpr &expr);
+bool IsWholeAssumedSizeArray(const parser::OmpObject &object);
+
bool IsMapEnteringType(parser::OmpMapType::Value type);
bool IsMapExitingType(parser::OmpMapType::Value type);
diff --git a/flang/lib/Semantics/check-omp-structure.cpp b/flang/lib/Semantics/check-omp-structure.cpp
index e640ca8c1d3d9..3dd6cd3d3103c 100644
--- a/flang/lib/Semantics/check-omp-structure.cpp
+++ b/flang/lib/Semantics/check-omp-structure.cpp
@@ -4246,6 +4246,7 @@ void OmpStructureChecker::Enter(const parser::OmpClause::Map &x) {
Directive dir{GetContext().directive};
llvm::ArrayRef<Directive> leafs{llvm::omp::getLeafConstructsOrSelf(dir)};
parser::OmpMapType::Value mapType{parser::OmpMapType::Value::Storage};
+ const parser::OmpObjectList &objects{DEREF(GetOmpObjectList(x))};
if (auto *type{OmpGetUniqueModifier<parser::OmpMapType>(modifiers)}) {
using Value = parser::OmpMapType::Value;
@@ -4325,7 +4326,8 @@ void OmpStructureChecker::Enter(const parser::OmpClause::Map &x) {
}};
evaluate::ExpressionAnalyzer ea{context_};
- for (auto &object : GetOmpObjectList(x)->v) {
+ auto restore{ea.AllowWholeAssumedSizeArray(true)};
+ for (auto &object : objects.v) {
if (const parser::Designator *d{GetDesignatorFromObj(object)}) {
if (auto &&expr{ea.Analyze(*d)}) {
if (hasBasePointer(*expr)) {
@@ -4355,6 +4357,16 @@ void OmpStructureChecker::Enter(const parser::OmpClause::Map &x) {
parser::ToUpperCaseLetters(
parser::OmpMapTypeModifier::EnumToString((**maybeIter)->v)));
}
+
+ if (version < 60) {
+ for (const parser::OmpObject &object : objects.v) {
+ if (IsWholeAssumedSizeArray(object)) {
+ auto maybeSource{GetObjectSource(object)};
+ context_.Say(maybeSource.value_or(GetContext().clauseSource),
+ "Whole assumed-size arrays are not allowed on MAP clause"_err_en_US);
+ }
+ }
+ }
}
void OmpStructureChecker::Enter(const parser::OmpClause::Schedule &x) {
@@ -4688,7 +4700,9 @@ void OmpStructureChecker::CheckStructureComponent(
if (const parser::DataRef *dataRef{
std::get_if<parser::DataRef>(&designator.u)}) {
if (!IsDataRefTypeParamInquiry(dataRef)) {
- const auto expr{AnalyzeExpr(context_, designator)};
+ evaluate::ExpressionAnalyzer ea{context_};
+ auto restore{ea.AllowWholeAssumedSizeArray(true)};
+ const auto expr{ea.Analyze(designator)};
if (expr.has_value() && evaluate::HasStructureComponent(expr.value())) {
context_.Say(designator.source,
"A variable that is part of another variable cannot appear on the %s clause"_err_en_US,
@@ -4789,6 +4803,8 @@ void OmpStructureChecker::Enter(const parser::OmpClause::UseDeviceAddr &x) {
SymbolSourceMap currSymbols;
GetSymbolsInObjectList(x.v, currSymbols);
semantics::UnorderedSymbolSet listVars;
+ unsigned version{context_.langOptions().OpenMPVersion};
+
for (auto [_, clause] :
FindClauses(llvm::omp::Clause::OMPC_use_device_addr)) {
const auto &useDeviceAddrClause{
@@ -4801,6 +4817,11 @@ void OmpStructureChecker::Enter(const parser::OmpClause::UseDeviceAddr &x) {
useDeviceAddrNameList.push_back(*name);
}
}
+ if (version < 60 && IsWholeAssumedSizeArray(ompObject)) {
+ auto maybeSource{GetObjectSource(ompObject)};
+ context_.Say(maybeSource.value_or(clause->source),
+ "Whole assumed-size arrays are not allowed on USE_DEVICE_ADDR clause"_err_en_US);
+ }
}
CheckMultipleOccurrence(
listVars, useDeviceAddrNameList, clause->source, "USE_DEVICE_ADDR");
diff --git a/flang/lib/Semantics/openmp-utils.cpp b/flang/lib/Semantics/openmp-utils.cpp
index a3912f31b4452..937938a0d10ce 100644
--- a/flang/lib/Semantics/openmp-utils.cpp
+++ b/flang/lib/Semantics/openmp-utils.cpp
@@ -212,6 +212,13 @@ bool IsVarOrFunctionRef(const MaybeExpr &expr) {
}
}
+bool IsWholeAssumedSizeArray(const parser::OmpObject &object) {
+ if (auto *sym{GetObjectSymbol(object)}; sym && IsAssumedSizeArray(*sym)) {
+ return !GetArrayElementFromObj(object);
+ }
+ return false;
+}
+
bool IsMapEnteringType(parser::OmpMapType::Value type) {
switch (type) {
case parser::OmpMapType::Value::Alloc:
diff --git a/flang/lib/Semantics/resolve-directives.cpp b/flang/lib/Semantics/resolve-directives.cpp
index 6211643b08970..fcad3bee415fd 100644
--- a/flang/lib/Semantics/resolve-directives.cpp
+++ b/flang/lib/Semantics/resolve-directives.cpp
@@ -932,12 +932,6 @@ class OmpAttributeVisitor : DirectiveAttributeVisitor<llvm::omp::Directive> {
ompFlag.value_or(Symbol::Flag::OmpMapStorage));
AddToContextObjectWithDSA(*name->symbol,
ompFlag.value_or(Symbol::Flag::OmpMapStorage));
- if (semantics::IsAssumedSizeArray(*name->symbol)) {
- context_.Say(designator.source,
- "Assumed-size whole arrays may not appear on the %s "
- "clause"_err_en_US,
- "MAP");
- }
}
}
},
diff --git a/flang/test/Semantics/OpenMP/map-clause-v60.f90 b/flang/test/Semantics/OpenMP/map-clause-v60.f90
new file mode 100644
index 0000000000000..2c73f2edaa6b0
--- /dev/null
+++ b/flang/test/Semantics/OpenMP/map-clause-v60.f90
@@ -0,0 +1,8 @@
+!RUN: %python %S/../test_errors.py %s %flang -fopenmp -fopenmp-version=60
+
+subroutine f00(a)
+ integer :: a(*)
+ ! No diagnostic expected, assumed-size arrays are allowed on MAP in 6.0.
+ !$omp target map(a)
+ !$omp end target
+end
diff --git a/flang/test/Semantics/OpenMP/map-clause.f90 b/flang/test/Semantics/OpenMP/map-clause.f90
index 65ecbd9456464..22c7b145f4501 100644
--- a/flang/test/Semantics/OpenMP/map-clause.f90
+++ b/flang/test/Semantics/OpenMP/map-clause.f90
@@ -8,7 +8,7 @@ subroutine sb(arr)
integer:: b, c, i
common /var/ b, c
- !ERROR: Assumed-size whole arrays may not appear on the MAP clause
+ !ERROR: Whole assumed-size arrays are not allowed on MAP clause
!$omp target map(arr)
do i = 1, 100
a = 3.14
diff --git a/flang/test/Semantics/OpenMP/use-device-addr-v60.f90 b/flang/test/Semantics/OpenMP/use-device-addr-v60.f90
new file mode 100644
index 0000000000000..6f43695cec2aa
--- /dev/null
+++ b/flang/test/Semantics/OpenMP/use-device-addr-v60.f90
@@ -0,0 +1,9 @@
+!RUN: %python %S/../test_errors.py %s %flang -fopenmp -fopenmp-version=60
+
+subroutine f00(a)
+ integer :: a(*)
+ ! No diagnostic expected, assumed-size arrays are allowed on USE_DEVICE_ADDR
+ ! in 6.0.
+ !$omp target_data use_device_addr(a)
+ !$omp end target_data
+end
diff --git a/flang/test/Semantics/OpenMP/use_device_addr1.f90 b/flang/test/Semantics/OpenMP/use_device_addr1.f90
index 350d236e00598..696ab3cc57278 100644
--- a/flang/test/Semantics/OpenMP/use_device_addr1.f90
+++ b/flang/test/Semantics/OpenMP/use_device_addr1.f90
@@ -5,7 +5,8 @@
! Same list item can not be present multiple times or in multipe
! USE_DEVICE_ADDR clauses.
-subroutine omp_target_data
+subroutine omp_target_data(asa)
+ integer :: asa(*)
integer :: a(1024)
integer, target :: b(1024)
type my_type
@@ -30,4 +31,7 @@ subroutine omp_target_data
b = a
!$omp end target data
+ !ERROR: Whole assumed-size arrays are not allowed on USE_DEVICE_ADDR clause
+ !$omp target data use_device_addr(asa)
+ !$omp end target data
end subroutine omp_target_data
More information about the flang-commits
mailing list