[Flang][OpenMP] Issue error for assumed-size array in Map clause
authorKiran Chandramohan <kiran.chandramohan@arm.com>
Wed, 29 Mar 2023 16:07:23 +0000 (16:07 +0000)
committerKiran Chandramohan <kiran.chandramohan@arm.com>
Wed, 29 Mar 2023 16:20:50 +0000 (16:20 +0000)
Error only applies if it is a whole array. Page 157 in OpenMP 5.2
standard.

Reviewed By: TIFitis

Differential Revision: https://reviews.llvm.org/D147142

flang/lib/Semantics/resolve-directives.cpp
flang/test/Semantics/OpenMP/map-clause.f90 [new file with mode: 0644]

index f16f53c..1bb1e67 100644 (file)
@@ -462,6 +462,28 @@ public:
   void Post(const parser::EndLabel &endLabel) { CheckSourceLabel(endLabel.v); }
   void Post(const parser::EorLabel &eorLabel) { CheckSourceLabel(eorLabel.v); }
 
+  void Post(const parser::OmpMapClause &x) {
+    const auto &ompObjList{std::get<parser::OmpObjectList>(x.t)};
+    for (const auto &ompObj : ompObjList.v) {
+      common::visit(
+          common::visitors{
+              [&](const parser::Designator &designator) {
+                if (const auto *name{GetDesignatorNameIfDataRef(designator)}) {
+                  if (name->symbol &&
+                      semantics::IsAssumedSizeArray(*name->symbol)) {
+                    context_.Say(designator.source,
+                        "Assumed-size whole arrays may not appear on the %s "
+                        "clause"_err_en_US,
+                        "MAP");
+                  }
+                }
+              },
+              [&](const auto &name) {},
+          },
+          ompObj.u);
+    }
+  }
+
   const parser::OmpClause *associatedClause{nullptr};
   void SetAssociatedClause(const parser::OmpClause &c) {
     associatedClause = &c;
diff --git a/flang/test/Semantics/OpenMP/map-clause.f90 b/flang/test/Semantics/OpenMP/map-clause.f90
new file mode 100644 (file)
index 0000000..b46b255
--- /dev/null
@@ -0,0 +1,26 @@
+! RUN: %python %S/../test_errors.py %s %flang -fopenmp
+! Check OpenMP MAP clause validity. Section 5.8.3 OpenMP 5.2.
+
+subroutine sb(arr)
+  real(8) :: arr(*)
+  real :: a
+
+  !ERROR: Assumed-size whole arrays may not appear on the MAP clause
+  !$omp target map(arr)
+  do i = 1, 100
+     a = 3.14
+  enddo
+  !$omp end target
+
+  !$omp target map(arr(:))
+  do i = 1, 100
+     a = 3.14
+  enddo
+  !$omp end target
+
+  !$omp target map(arr(3:5))
+  do i = 1, 100
+     a = 3.14
+  enddo
+  !$omp end target
+end subroutine