Fortran: With OpenACC, ignore OpenMP's cond comp sentinels
authorTobias Burnus <tobias@codesourcery.com>
Mon, 30 Nov 2020 14:30:51 +0000 (15:30 +0100)
committerTobias Burnus <tobias@codesourcery.com>
Mon, 30 Nov 2020 14:31:22 +0000 (15:31 +0100)
gcc/fortran/ChangeLog:

PR fortran/98011
* scanner.c (skip_free_comments, skip_fixed_comments): If only
-fopenacc but not -fopenmp is used, ignore OpenMP's conditional
compilation sentinels. Fix indentation, use 'else if' for readability.

gcc/testsuite/ChangeLog:

PR fortran/98011
* gfortran.dg/goacc/sentinel-free-form.f95:
* gfortran.dg/goacc-gomp/fixed-1.f: New test.
* gfortran.dg/goacc-gomp/free-1.f90: New test.
* gfortran.dg/goacc/fixed-5.f: New test.

gcc/fortran/scanner.c
gcc/testsuite/gfortran.dg/goacc-gomp/fixed-1.f [new file with mode: 0644]
gcc/testsuite/gfortran.dg/goacc-gomp/free-1.f90 [new file with mode: 0644]
gcc/testsuite/gfortran.dg/goacc/fixed-5.f [new file with mode: 0644]
gcc/testsuite/gfortran.dg/goacc/sentinel-free-form.f95

index fd11f5a244ae11dc7f943db9d3794f55f624a125..304ae2d8d6a70f34e8ec15bdf9d345e5e167079b 100644 (file)
@@ -899,21 +899,14 @@ skip_free_comments (void)
                if (next_char () == '$')
                  {
                    c = next_char ();
-                     if (c == 'a' || c == 'A')
-                       {
-                         if (skip_free_oacc_sentinel (start, old_loc))
-                           return false;
-                         gfc_current_locus = old_loc;
-                         next_char();
-                         c = next_char();
-                       }
-                     if (continue_flag || c == ' ' || c == '\t')
-                       {
-                         gfc_current_locus = old_loc;
-                         next_char();
-                         openacc_flag = 0;
-                         return true;
-                       }
+                   if (c == 'a' || c == 'A')
+                     {
+                       if (skip_free_oacc_sentinel (start, old_loc))
+                         return false;
+                       gfc_current_locus = old_loc;
+                       next_char();
+                       c = next_char();
+                     }
                  }
                gfc_current_locus = old_loc;
              }
@@ -1076,8 +1069,7 @@ skip_fixed_comments (void)
                }
              gfc_current_locus = start;
            }
-
-         if (flag_openacc && !(flag_openmp || flag_openmp_simd))
+         else if (flag_openacc && !(flag_openmp || flag_openmp_simd))
            {
              if (next_char () == '$')
                {
@@ -1087,13 +1079,10 @@ skip_fixed_comments (void)
                      if (skip_fixed_oacc_sentinel (&start))
                        return;
                    }
-                 else
-                   goto check_for_digits;
                }
              gfc_current_locus = start;
            }
-
-         if (flag_openacc || flag_openmp || flag_openmp_simd)
+         else if (flag_openacc || flag_openmp || flag_openmp_simd)
            {
              if (next_char () == '$')
                {
@@ -1120,6 +1109,7 @@ skip_fixed_comments (void)
          gcc_unreachable ();
 check_for_digits:
          {
+           /* Required for OpenMP's conditional compilation sentinel. */
            int digit_seen = 0;
 
            for (col = 3; col < 6; col++, c = next_char ())
diff --git a/gcc/testsuite/gfortran.dg/goacc-gomp/fixed-1.f b/gcc/testsuite/gfortran.dg/goacc-gomp/fixed-1.f
new file mode 100644 (file)
index 0000000..b6bab4c
--- /dev/null
@@ -0,0 +1,81 @@
+! { dg-additional-options "-fdump-tree-original -Wunused-variable" }
+      implicit none
+      integer :: a,b,c,d,e,f,g,h,i,j,k,ll
+
+c$bogus
+!$bogus
+*$bogus
+
+c$ bogus
+!$ bogus
+*$ bogus
+
+c$a23 bogus
+!$ a  bogus
+*$12a bogus
+
+! The following should be parsed as OpenMP conditional sentinel
+! If not, expect a unused-variable warning
+
+c$    a = 1
+!$    b = 2
+*$    c = 3
+
+c$ 1  d = 4
+!$ 22 e = 5
+*$34  f = 6
+
+c$    g = 
+c$   *7
+!$ 2  h =
+*$   & 8
+*$ 3  i
+!$   & = 9
+
+c$    j
+*$   &= 
+c$   *10
+!$ 5  k
+*$   * =
+c$   & 1
+*$   & 1
+*$9 9 ll
+!$   & =
+!$   *  12
+
+c$ bogus
+!$ bogus
+*$ bogus
+
+c$bogus
+!$bogus
+*$bogus
+
+c$ acc bogus
+!$ acc bogus
+*$ acc bogus
+
+c$ omp bogus
+!$ omp bogus
+*$ omp bogus
+      end
+
+!{ dg-final { scan-tree-dump-times "a = 1;" 1 "original" } }
+!{ dg-final { scan-tree-dump-times "b = 2;" 1 "original" } }
+!{ dg-final { scan-tree-dump-times "c = 3;" 1 "original" } }
+!{ dg-final { scan-tree-dump-times "d = 4;" 1 "original" } }
+!{ dg-final { scan-tree-dump-times "e = 5;" 1 "original" } }
+!{ dg-final { scan-tree-dump-times "f = 6;" 1 "original" } }
+!{ dg-final { scan-tree-dump-times "g = 7;" 1 "original" } }
+!{ dg-final { scan-tree-dump-times "h = 8;" 1 "original" } }
+!{ dg-final { scan-tree-dump-times "i = 9;" 1 "original" } }
+!{ dg-final { scan-tree-dump-times "j = 10;" 1 "original" } }
+!{ dg-final { scan-tree-dump-times "k = 11;" 1 "original" } }
+!{ dg-final { scan-tree-dump-times "ll = 12;" 1 "original" } }
+!{ dg-final { scan-tree-dump-times "__label_000001:;" 1 "original" } }
+!{ dg-final { scan-tree-dump-times "__label_000022:;" 1 "original" } }
+!{ dg-final { scan-tree-dump-times "__label_000034:;" 1 "original" } }
+!{ dg-final { scan-tree-dump-times "__label_000002:;" 1 "original" } }
+!{ dg-final { scan-tree-dump-times "__label_000003:;" 1 "original" } }
+!{ dg-final { scan-tree-dump-times "__label_000005:;" 1 "original" } }
+!{ dg-final { scan-tree-dump-times "__label_000099:;" 1 "original" } }
diff --git a/gcc/testsuite/gfortran.dg/goacc-gomp/free-1.f90 b/gcc/testsuite/gfortran.dg/goacc-gomp/free-1.f90
new file mode 100644 (file)
index 0000000..0d6f2b2
--- /dev/null
@@ -0,0 +1,34 @@
+! { dg-additional-options "-fdump-tree-original -Wunused-variable" }
+implicit none
+integer :: a,b,c,d,e,f,g,h
+
+!$bogus
+
+    !$bogus
+!$& bogus
+   !$& bogus
+
+!$    a = 1
+!$ b = 2
+!$ c = &
+!$3
+
+!$ d = &
+!$&4
+
+  !$    e = 5
+ !$ f = 6
+   !$ g = &
+ !$7
+
+ !$ h = &
+!$&8
+      end
+
+!{ dg-final { scan-tree-dump-times "a = 1;" 1 "original" } }
+!{ dg-final { scan-tree-dump-times "b = 2;" 1 "original" } }
+!{ dg-final { scan-tree-dump-times "c = 3;" 1 "original" } }
+!{ dg-final { scan-tree-dump-times "d = 4;" 1 "original" } }
+!{ dg-final { scan-tree-dump-times "e = 5;" 1 "original" } }
+!{ dg-final { scan-tree-dump-times "f = 6;" 1 "original" } }
+!{ dg-final { scan-tree-dump-times "g = 7;" 1 "original" } }
diff --git a/gcc/testsuite/gfortran.dg/goacc/fixed-5.f b/gcc/testsuite/gfortran.dg/goacc/fixed-5.f
new file mode 100644 (file)
index 0000000..ab51b21
--- /dev/null
@@ -0,0 +1,30 @@
+! Check that OpenMP conditional compilations sentinels ('!$ ') are ignored
+
+c$ bogus
+!$ bogus
+*$ bogus
+c$    bogus
+!$    bogus
+*$    bogus
+
+c$a23 bogus
+!$ a  bogus
+*$12a bogus
+
+c$ 1  bogus
+!$ 22 bogus
+*$34  bogus
+
+c$bogus
+!$bogus
+*$bogus
+
+c$ acc bogus
+!$ acc bogus
+*$ acc bogus
+
+c$ acc bogus
+!$ acc bogus
+*$ acc bogus
+
+      end
index 1a3189cb34e63d9cf161594cbf80b585f71a21b2..00dac667ef1f3fd8b1d6f91b508aff61efd01261 100644 (file)
@@ -10,7 +10,10 @@ program test
   x = 0.0 !$acc parallel ! comment
   ! sentinel must appear as a single word
   ! $acc parallel ! comment
-  !$ acc parallel ! { dg-error "Unclassifiable statement" }
+
+  ! note that '!$ ' is OpenMP's conditional compilation sentinel
+  !$ acc ignored_due_to_space  ! comment
+
   ! directive lines must have space after sentinel
   !$accparallel ! { dg-warning "followed by a space" }
   do i = 1,10
@@ -18,4 +21,4 @@ program test
   enddo
   !$acc end parallel ! { dg-error "Unexpected" }
   print *, x
-end
\ No newline at end of file
+end