OpenMP/Fortran: Permit impure ELEMENTAL in omp directives
authorTobias Burnus <tobias@codesourcery.com>
Tue, 16 Jun 2020 18:17:20 +0000 (20:17 +0200)
committerTobias Burnus <tobias@codesourcery.com>
Tue, 16 Jun 2020 18:17:20 +0000 (20:17 +0200)
OpenMP since 4.5 permits IMPURE ELEMENTAL in directives and
the code already only checked for PURE. – Followup for
-fopenmp-simd.

gcc/fortran/ChangeLog:

* parse.c (decode_omp_directive): Remove "or ELEMENTAL"
from "in PURE" error message also for -fopenmp-simd.

gcc/testsuite/ChangeLog:

* gfortran.dg/gomp/pr79154-simd.f90: New test.

gcc/fortran/parse.c
gcc/testsuite/gfortran.dg/gomp/pr79154-simd.f90 [new file with mode: 0644]

index 9d90e501bf69a1bb181ddd9e4bafeda4eab0d668..46e1e1b2698a6200e8e429a154ad48da98264627 100644 (file)
@@ -1078,8 +1078,7 @@ decode_omp_directive (void)
       if (!flag_openmp && gfc_pure (NULL))
        {
          gfc_error_now ("OpenMP directives other than SIMD or DECLARE TARGET "
-                        "at %C may not appear in PURE or ELEMENTAL "
-                        "procedures");
+                        "at %C may not appear in PURE procedures");
          reject_statement ();
          gfc_error_recovery ();
          return ST_NONE;
diff --git a/gcc/testsuite/gfortran.dg/gomp/pr79154-simd.f90 b/gcc/testsuite/gfortran.dg/gomp/pr79154-simd.f90
new file mode 100644 (file)
index 0000000..d6b72d6
--- /dev/null
@@ -0,0 +1,16 @@
+! { dg-options "-fno-openmp -fopenmp-simd" }
+!
+pure subroutine bar(a)
+  integer, intent(in) :: a(:)
+  !$omp target enter data map(to:a)   ! Ignored with -fopenmp-simd otherwise invalid in PURE
+end
+
+pure subroutine foo(a,b)
+  integer, intent(out) :: a(5)
+  integer, intent(in) :: b(5)
+  !$omp target teams distribute simd ! { dg-error "may not appear in PURE procedures" }
+  do i=1, 5
+    a(i) = b(i)
+  end do
+  !$omp end target teams distribute
+end subroutine