]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
OpenMP/Fortran: Permit impure ELEMENTAL in omp directives
authorTobias Burnus <tobias@codesourcery.com>
Tue, 16 Jun 2020 13:11:12 +0000 (15:11 +0200)
committerTobias Burnus <tobias@codesourcery.com>
Tue, 16 Jun 2020 13:11:12 +0000 (15:11 +0200)
OpenMP since 4.5 permits IMPURE ELEMENTAL in directives and
the code already only checked for PURE.

gcc/fortran/ChangeLog:

* parse.c (decode_omp_directive): Remove "or ELEMENTAL"
from "in PURE" error message.

gcc/testsuite/ChangeLog:

* gfortran.dg/gomp/pr79154-1.f90: Update dg-*;
add an impure elemental example.
* gfortran.dg/gomp/pr79154-2.f90: Likewise.

gcc/fortran/parse.c
gcc/testsuite/gfortran.dg/gomp/pr79154-1.f90
gcc/testsuite/gfortran.dg/gomp/pr79154-2.f90

index f71a95dd8719b5855f2421302d039e0aaf5fdc50..9d90e501bf69a1bb181ddd9e4bafeda4eab0d668 100644 (file)
@@ -849,7 +849,7 @@ decode_omp_directive (void)
   /* match is for directives that should be recognized only if
      -fopenmp, matchs for directives that should be recognized
      if either -fopenmp or -fopenmp-simd.
-     Handle only the directives allowed in PURE/ELEMENTAL procedures
+     Handle only the directives allowed in PURE procedures
      first (those also shall not turn off implicit pure).  */
   switch (c)
     {
@@ -868,7 +868,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");
       gfc_error_recovery ();
       return ST_NONE;
     }
index 69a0009e13c2c8c35c1afbfb081921a26de773dd..ea147bfa78ec716b7534f9b098c1fc0b98b1d397 100644 (file)
@@ -2,7 +2,7 @@
 ! { dg-do compile }
 
 pure real function foo (a, b)          ! { dg-warning "GCC does not currently support mixed size types for 'simd' functions" "" { target aarch64*-*-* } }
-!$omp declare simd(foo)                        ! { dg-bogus "may not appear in PURE or ELEMENTAL" }
+!$omp declare simd(foo)                        ! { dg-bogus "may not appear in PURE" }
   real, intent(in) :: a, b
   foo = a + b
 end function foo
@@ -10,23 +10,28 @@ pure function bar (a, b)
   real, intent(in) :: a(8), b(8)
   real :: bar(8)
   integer :: i
-!$omp simd                             ! { dg-bogus "may not appear in PURE or ELEMENTAL" }
+!$omp simd                             ! { dg-bogus "may not appear in PURE" }
   do i = 1, 8
     bar(i) = a(i) + b(i)
   end do
 end function bar
 pure real function baz (a, b)
-!$omp declare target                   ! { dg-bogus "may not appear in PURE or ELEMENTAL" }
+!$omp declare target                   ! { dg-bogus "may not appear in PURE" }
   real, intent(in) :: a, b
   baz = a + b
 end function baz
 elemental real function fooe (a, b)    ! { dg-warning "GCC does not currently support mixed size types for 'simd' functions" "" { target aarch64*-*-* } }
-!$omp declare simd(fooe)               ! { dg-bogus "may not appear in PURE or ELEMENTAL" }
+!$omp declare simd(fooe)               ! { dg-bogus "may not appear in PURE" }
   real, intent(in) :: a, b
   fooe = a + b
 end function fooe
 elemental real function baze (a, b)
-!$omp declare target                   ! { dg-bogus "may not appear in PURE or ELEMENTAL" }
+!$omp declare target                   ! { dg-bogus "may not appear in PURE" }
   real, intent(in) :: a, b
   baze = a + b
 end function baze
+elemental impure real function bazei (a, b)
+!$omp declare target                   ! { dg-bogus "may not appear in PURE" }
+  real, intent(in) :: a, b
+  baze = a + b
+end function bazei
index 67344f0c028df2db1a29aaa917a9046175426bd7..38d3fe5c384261d71d7d61bba45d069bc2d187bc 100644 (file)
@@ -3,14 +3,14 @@
 
 pure real function foo (a, b)
   real, intent(in) :: a, b
-!$omp taskwait                         ! { dg-error "may not appear in PURE or ELEMENTAL" }
+!$omp taskwait                         ! { dg-error "may not appear in PURE" }
   foo = a + b
 end function foo
 pure function bar (a, b)
   real, intent(in) :: a(8), b(8)
   real :: bar(8)
   integer :: i
-!$omp do simd                          ! { dg-error "may not appear in PURE or ELEMENTAL" }
+!$omp do simd                          ! { dg-error "may not appear in PURE" }
   do i = 1, 8
     bar(i) = a(i) + b(i)
   end do
@@ -19,26 +19,38 @@ pure function baz (a, b)
   real, intent(in) :: a(8), b(8)
   real :: baz(8)
   integer :: i
-!$omp do                               ! { dg-error "may not appear in PURE or ELEMENTAL" }
+!$omp do                               ! { dg-error "may not appear in PURE" }
   do i = 1, 8
     baz(i) = a(i) + b(i)
   end do
-!$omp end do                           ! { dg-error "may not appear in PURE or ELEMENTAL" }
+!$omp end do                           ! { dg-error "may not appear in PURE" }
 end function baz
 pure real function baz2 (a, b)
   real, intent(in) :: a, b
-!$omp target map(from:baz2)            ! { dg-error "may not appear in PURE or ELEMENTAL" }
+!$omp target map(from:baz2)            ! { dg-error "may not appear in PURE" }
   baz2 = a + b
-!$omp end target                       ! { dg-error "may not appear in PURE or ELEMENTAL" }
+!$omp end target                       ! { dg-error "may not appear in PURE" }
 end function baz2
+! ELEMENTAL implies PURE
 elemental real function fooe (a, b)
   real, intent(in) :: a, b
-!$omp taskyield                                ! { dg-error "may not appear in PURE or ELEMENTAL" }
+!$omp taskyield                                ! { dg-error "may not appear in PURE" }
   fooe = a + b
 end function fooe
 elemental real function baze (a, b)
   real, intent(in) :: a, b
-!$omp target map(from:baz)             ! { dg-error "may not appear in PURE or ELEMENTAL" }
+!$omp target map(from:baz)             ! { dg-error "may not appear in PURE" }
   baze = a + b
-!$omp end target                       ! { dg-error "may not appear in PURE or ELEMENTAL" }
+!$omp end target                       ! { dg-error "may not appear in PURE" }
 end function baze
+elemental impure real function fooei (a, b)
+  real, intent(in) :: a, b
+!$omp taskyield                                ! { dg-bogus "may not appear in PURE" }
+  fooe = a + b
+end function fooei
+elemental impure real function bazei (a, b)
+  real, intent(in) :: a, b
+!$omp target map(from:baz)             ! { dg-bogus "may not appear in PURE" }
+  baze = a + b
+!$omp end target                       ! { dg-bogus "may not appear in PURE" }
+end function bazei