Add Semantic check for Flang OpenMP 4.5 - 2.15.3.2 and 2.15.3.3 shared and private...
authorYashaswini <yhegde@gmail.com>
Sun, 22 Nov 2020 06:32:00 +0000 (12:02 +0530)
committerYashaswini <yhegde@gmail.com>
Sun, 22 Nov 2020 07:20:17 +0000 (12:50 +0530)
Semantic check to restrict the appearance of a variable that is part of another variable
 (as an array or structure element) in a PRIVATE or SHARED clause.

Test Cases:

omp-parallel-private01.f90
omp-parallel-private02.f90
omp-parallel-private03.f90
omp-parallel-private04.f90
omp-parallel-shared01.f90
omp-parallel-shared02.f90
omp-parallel-shared03.f90
omp-parallel-shared04.f90

Reviewed by: Kiran Chandramohan @kiranchandramohan , Valentin Clement @clementval

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

flang/lib/Semantics/check-omp-structure.cpp
flang/lib/Semantics/check-omp-structure.h
flang/test/Semantics/omp-parallel-private01.f90 [new file with mode: 0644]
flang/test/Semantics/omp-parallel-private02.f90 [new file with mode: 0644]
flang/test/Semantics/omp-parallel-private03.f90 [new file with mode: 0644]
flang/test/Semantics/omp-parallel-private04.f90 [new file with mode: 0644]
flang/test/Semantics/omp-parallel-shared01.f90 [new file with mode: 0644]
flang/test/Semantics/omp-parallel-shared02.f90 [new file with mode: 0644]
flang/test/Semantics/omp-parallel-shared03.f90 [new file with mode: 0644]
flang/test/Semantics/omp-parallel-shared04.f90 [new file with mode: 0644]

index d3430d724651d7f3d08dc99e323ea8f65c106763..636471da78d1d4ad4ef7d8253f7b819e445d7d4f 100644 (file)
@@ -372,8 +372,6 @@ CHECK_SIMPLE_CLAUSE(Link, OMPC_link)
 CHECK_SIMPLE_CLAUSE(Mergeable, OMPC_mergeable)
 CHECK_SIMPLE_CLAUSE(Nogroup, OMPC_nogroup)
 CHECK_SIMPLE_CLAUSE(Notinbranch, OMPC_notinbranch)
-CHECK_SIMPLE_CLAUSE(Private, OMPC_private)
-CHECK_SIMPLE_CLAUSE(Shared, OMPC_shared)
 CHECK_SIMPLE_CLAUSE(To, OMPC_to)
 CHECK_SIMPLE_CLAUSE(Uniform, OMPC_uniform)
 CHECK_SIMPLE_CLAUSE(Untied, OMPC_untied)
@@ -412,6 +410,37 @@ void OmpStructureChecker::Enter(const parser::OmpClause::Ordered &x) {
   }
 }
 
+void OmpStructureChecker::Enter(const parser::OmpClause::Shared &x) {
+  CheckAllowed(llvm::omp::Clause::OMPC_shared);
+  CheckIsVarPartOfAnotherVar(x.v);
+}
+void OmpStructureChecker::Enter(const parser::OmpClause::Private &x) {
+  CheckAllowed(llvm::omp::Clause::OMPC_private);
+  CheckIsVarPartOfAnotherVar(x.v);
+}
+
+void OmpStructureChecker::CheckIsVarPartOfAnotherVar(
+    const parser::OmpObjectList &objList) {
+
+  for (const auto &ompObject : objList.v) {
+    std::visit(
+        common::visitors{
+            [&](const parser::Designator &designator) {
+              if (std::get_if<parser::DataRef>(&designator.u)) {
+                if ((parser::Unwrap<parser::StructureComponent>(ompObject)) ||
+                    (parser::Unwrap<parser::ArrayElement>(ompObject))) {
+                  context_.Say(GetContext().clauseSource,
+                      "A variable that is part of another variable (as an "
+                      "array or structure element)"
+                      " cannot appear in a PRIVATE or SHARED clause."_err_en_US);
+                }
+              }
+            },
+            [&](const parser::Name &name) {},
+        },
+        ompObject.u);
+  }
+}
 // Following clauses have a seperate node in parse-tree.h.
 CHECK_SIMPLE_PARSER_CLAUSE(OmpAllocateClause, OMPC_allocate)
 CHECK_SIMPLE_PARSER_CLAUSE(OmpDefaultClause, OMPC_default)
index 8384efecb8406aab91e20c912c32be4d99dc5549..5539ca2566f27517f6de3d0df67b0f7e2a0fc8b3 100644 (file)
@@ -185,6 +185,8 @@ private:
   void CheckDependList(const parser::DataRef &);
   void CheckDependArraySection(
       const common::Indirection<parser::ArrayElement> &, const parser::Name &);
+
+  void CheckIsVarPartOfAnotherVar(const parser::OmpObjectList &objList);
 };
 } // namespace Fortran::semantics
 #endif // FORTRAN_SEMANTICS_CHECK_OMP_STRUCTURE_H_
diff --git a/flang/test/Semantics/omp-parallel-private01.f90 b/flang/test/Semantics/omp-parallel-private01.f90
new file mode 100644 (file)
index 0000000..029c36f
--- /dev/null
@@ -0,0 +1,20 @@
+!RUN: %S/test_errors.sh %s %t %f18 -fopenmp
+! OpenMP Version 4.5
+! 2.15.3.3 parallel private Clause
+program omp_parallel_private
+  integer :: i, j, a(10), b(10), c(10)
+  integer :: k = 10
+  type my_type
+    integer :: array(10)
+  end type my_type
+
+  type(my_type) :: my_var
+
+  !ERROR: A variable that is part of another variable (as an array or structure element) cannot appear in a PRIVATE or SHARED clause.
+  !$omp parallel private(my_var%array)
+  do i = 1, 10
+    c(i) = a(i) + b(i) + k
+    my_var%array(i) = k
+  end do
+  !$omp end parallel
+end program omp_parallel_private
diff --git a/flang/test/Semantics/omp-parallel-private02.f90 b/flang/test/Semantics/omp-parallel-private02.f90
new file mode 100644 (file)
index 0000000..b452b0e
--- /dev/null
@@ -0,0 +1,20 @@
+!RUN: %S/test_errors.sh %s %t %f18 -fopenmp
+! OpenMP Version 4.5
+! 2.15.3.3 parallel private Clause
+program omp_parallel_private
+  integer :: i, j, a(10), b(10), c(10)
+  integer :: k = 10
+  integer :: array(10)
+
+  do i = 1, 10
+    array(i) = i
+  end do
+
+  !ERROR: A variable that is part of another variable (as an array or structure element) cannot appear in a PRIVATE or SHARED clause.
+  !$omp parallel private(array(i))
+  do i = 1, 10
+    c(i) = a(i) + b(i) + k
+    array(i) = k
+  end do
+  !$omp end parallel
+end program omp_parallel_private
diff --git a/flang/test/Semantics/omp-parallel-private03.f90 b/flang/test/Semantics/omp-parallel-private03.f90
new file mode 100644 (file)
index 0000000..18d5bc1
--- /dev/null
@@ -0,0 +1,28 @@
+!RUN: %S/test_errors.sh %s %t %f18 -fopenmp
+! OpenMP Version 4.5
+! 2.15.3.3 parallel private Clause
+program omp_parallel_private
+  integer :: i, j, a(10), b(10), c(10)
+  integer :: k = 10
+  type my_type
+    integer :: array(10)
+  end type my_type
+
+  type(my_type) :: my_var
+
+  real :: arr(10)
+  integer :: intx = 10
+
+  do i = 1, 10
+    arr(i) = 0.0
+  end do
+
+  !ERROR: A variable that is part of another variable (as an array or structure element) cannot appear in a PRIVATE or SHARED clause.
+  !$omp parallel private(arr(i),intx)
+  do i = 1, 10
+    c(i) = a(i) + b(i) + k
+    my_var%array(i) = k+intx
+    arr(i) = k
+  end do
+  !$omp end parallel
+end program omp_parallel_private
diff --git a/flang/test/Semantics/omp-parallel-private04.f90 b/flang/test/Semantics/omp-parallel-private04.f90
new file mode 100644 (file)
index 0000000..9a8765b
--- /dev/null
@@ -0,0 +1,28 @@
+!RUN: %S/test_errors.sh %s %t %f18 -fopenmp
+! OpenMP Version 4.5
+! 2.15.3.3 parallel private Clause
+program omp_parallel_private
+  integer :: i, j, a(10), b(10), c(10)
+  integer :: k = 10
+  type my_type
+    integer :: array(10)
+  end type my_type
+
+  type(my_type) :: my_var
+
+  real :: arr(10)
+  integer :: intx = 10
+
+  do i = 1, 10
+    arr(i) = 0.0
+  end do
+
+  !ERROR: A variable that is part of another variable (as an array or structure element) cannot appear in a PRIVATE or SHARED clause.
+  !$omp parallel private(arr,intx,my_var%array(1))
+  do i = 1, 10
+    c(i) = a(i) + b(i) + k
+    my_var%array(i) = k+intx
+    arr(i) = k
+  end do
+  !$omp end parallel
+end program omp_parallel_private
diff --git a/flang/test/Semantics/omp-parallel-shared01.f90 b/flang/test/Semantics/omp-parallel-shared01.f90
new file mode 100644 (file)
index 0000000..7dda194
--- /dev/null
@@ -0,0 +1,20 @@
+!RUN: %S/test_errors.sh %s %t %f18 -fopenmp
+! OpenMP Version 4.5
+! 2.15.3.2 parallel shared Clause
+program omp_parallel_shared
+  integer :: i, j, a(10), b(10), c(10)
+  integer :: k = 10
+  type my_type
+  integer :: array(10)
+  end type my_type
+
+  type(my_type) :: my_var
+
+  !ERROR: A variable that is part of another variable (as an array or structure element) cannot appear in a PRIVATE or SHARED clause.
+  !$omp parallel shared(my_var%array)
+  do i = 1, 10
+    c(i) = a(i) + b(i) +  k
+    my_var%array(i) = k
+  end do
+  !$omp end parallel
+end program omp_parallel_shared
diff --git a/flang/test/Semantics/omp-parallel-shared02.f90 b/flang/test/Semantics/omp-parallel-shared02.f90
new file mode 100644 (file)
index 0000000..50b2ece
--- /dev/null
@@ -0,0 +1,20 @@
+!RUN: %S/test_errors.sh %s %t %f18 -fopenmp
+! OpenMP Version 4.5
+! 2.15.3.2 parallel shared Clause
+program omp_parallel_shared
+  integer :: i, j, a(10), b(10), c(10)
+  integer :: k = 10
+  integer :: array(10)
+
+  do i = 1, 10
+    array(i) = i
+  end do
+
+  !ERROR: A variable that is part of another variable (as an array or structure element) cannot appear in a PRIVATE or SHARED clause.
+  !$omp parallel shared(array(i))
+  do i = 1, 10
+    c(i) = a(i) + b(i) + k
+    array(i) = k
+  end do
+  !$omp end parallel
+end program omp_parallel_shared
diff --git a/flang/test/Semantics/omp-parallel-shared03.f90 b/flang/test/Semantics/omp-parallel-shared03.f90
new file mode 100644 (file)
index 0000000..386023e
--- /dev/null
@@ -0,0 +1,28 @@
+!RUN: %S/test_errors.sh %s %t %f18 -fopenmp
+! OpenMP Version 4.5
+! 2.15.3.2 parallel shared Clause
+program omp_parallel_shared
+  integer :: i, j, a(10), b(10), c(10)
+  integer :: k = 10
+  type my_type
+    integer :: array(10)
+  end type my_type
+
+  type(my_type) :: my_var
+
+  real :: arr(10)
+  integer :: intx = 10
+
+  do i = 1, 10
+    arr(i) = 0.0
+  end do
+
+  !ERROR: A variable that is part of another variable (as an array or structure element) cannot appear in a PRIVATE or SHARED clause.
+  !$omp parallel shared(arr(i),intx)
+  do i = 1, 10
+     c(i) = a(i) + b(i) + k
+     my_var%array(i) = k+intx
+     arr(i) = k
+  end do
+  !$omp end parallel
+end program omp_parallel_shared
diff --git a/flang/test/Semantics/omp-parallel-shared04.f90 b/flang/test/Semantics/omp-parallel-shared04.f90
new file mode 100644 (file)
index 0000000..3a7c3f9
--- /dev/null
@@ -0,0 +1,28 @@
+!RUN: %S/test_errors.sh %s %t %f18 -fopenmp
+! OpenMP Version 4.5
+! 2.15.3.2 parallel shared Clause
+program omp_parallel_shared
+  integer :: i, j, a(10), b(10), c(10)
+  integer :: k = 10
+  type my_type
+    integer :: array(10)
+  end type my_type
+
+  type(my_type) :: my_var
+
+  real :: arr(10)
+  integer :: intx = 10
+
+  do i = 1, 10
+    arr(i) = 0.0
+  end do
+
+  !ERROR: A variable that is part of another variable (as an array or structure element) cannot appear in a PRIVATE or SHARED clause.
+  !$omp parallel shared(arr,intx,my_var%array(1))
+  do i = 1, 10
+    c(i) = a(i) + b(i) + k
+    my_var%array(i) = k+intx
+    arr(i) = k
+  end do
+  !$omp end parallel
+end program omp_parallel_shared