[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