public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc r12-1216] Fortran: Fix OpenMP/OpenACC continue-line parsing
@ 2021-06-04 15:44 Tobias Burnus
  0 siblings, 0 replies; only message in thread
From: Tobias Burnus @ 2021-06-04 15:44 UTC (permalink / raw)
  To: gcc-cvs

https://gcc.gnu.org/g:4facf2bf5b7b32f444da864306b5c11e14c15bcf

commit r12-1216-g4facf2bf5b7b32f444da864306b5c11e14c15bcf
Author: Tobias Burnus <tobias@codesourcery.com>
Date:   Fri Jun 4 17:43:59 2021 +0200

    Fortran: Fix OpenMP/OpenACC continue-line parsing
    
    gcc/fortran/ChangeLog:
    
            * scanner.c (skip_fixed_omp_sentinel): Set openacc_flag if
            this is not an (OpenMP) continuation line.
            (skip_fixed_oacc_sentinel): Likewise for openmp_flag and OpenACC.
            (gfc_next_char_literal): gfc_error_now to force error for mixed OMP/ACC
            continuation once per location and return '\n'.
    
    gcc/testsuite/ChangeLog:
    
            * gfortran.dg/goacc/omp-fixed.f: Re-add test item changed in previous
            commit in addition - add more dg-errors and '... end ...' due to changed
            parsing.
            * gfortran.dg/goacc/omp.f95: Likewise.
            * gfortran.dg/goacc-gomp/mixed-1.f: New test.

Diff:
---
 gcc/fortran/scanner.c                          | 35 +++++++++++++++++---------
 gcc/testsuite/gfortran.dg/goacc-gomp/mixed-1.f | 23 +++++++++++++++++
 gcc/testsuite/gfortran.dg/goacc/omp-fixed.f    | 10 +++++++-
 gcc/testsuite/gfortran.dg/goacc/omp.f95        | 12 +++++++++
 4 files changed, 67 insertions(+), 13 deletions(-)

diff --git a/gcc/fortran/scanner.c b/gcc/fortran/scanner.c
index 74c5461ed6f..39db0994b62 100644
--- a/gcc/fortran/scanner.c
+++ b/gcc/fortran/scanner.c
@@ -942,6 +942,8 @@ skip_fixed_omp_sentinel (locus *start)
 	  && (continue_flag
 	      || c == ' ' || c == '\t' || c == '0'))
 	{
+	  if (c == ' ' || c == '\t' || c == '0')
+	    openacc_flag = 0;
 	  do
 	    c = next_char ();
 	  while (gfc_is_whitespace (c));
@@ -971,6 +973,8 @@ skip_fixed_oacc_sentinel (locus *start)
 	  && (continue_flag
 	      || c == ' ' || c == '\t' || c == '0'))
 	{
+	  if (c == ' ' || c == '\t' || c == '0')
+	    openmp_flag = 0;
 	  do
 	    c = next_char ();
 	  while (gfc_is_whitespace (c));
@@ -1205,6 +1209,7 @@ gfc_skip_comments (void)
 gfc_char_t
 gfc_next_char_literal (gfc_instring in_string)
 {
+  static locus omp_acc_err_loc = {};
   locus old_loc;
   int i, prev_openmp_flag, prev_openacc_flag;
   gfc_char_t c;
@@ -1403,14 +1408,16 @@ restart:
 	    {
 	      if (gfc_wide_tolower (c) != (unsigned char) "!$acc"[i])
 		is_openmp = 1;
-	      if (i == 4)
-		old_loc = gfc_current_locus;
 	    }
-	  gfc_error (is_openmp
-		     ? G_("Wrong OpenACC continuation at %C: "
-			  "expected !$ACC, got !$OMP")
-		     : G_("Wrong OpenMP continuation at %C: "
-			  "expected !$OMP, got !$ACC"));
+	  if (omp_acc_err_loc.nextc != gfc_current_locus.nextc
+	      || omp_acc_err_loc.lb != gfc_current_locus.lb)
+	    gfc_error_now (is_openmp
+			   ? G_("Wrong OpenACC continuation at %C: "
+				"expected !$ACC, got !$OMP")
+			   : G_("Wrong OpenMP continuation at %C: "
+				"expected !$OMP, got !$ACC"));
+	  omp_acc_err_loc = gfc_current_locus;
+	  goto not_continuation;
 	}
 
       if (c != '&')
@@ -1511,11 +1518,15 @@ restart:
 	      if (gfc_wide_tolower (c) != (unsigned char) "*$acc"[i])
 		is_openmp = 1;
 	    }
-	  gfc_error (is_openmp
-		     ? G_("Wrong OpenACC continuation at %C: "
-			  "expected !$ACC, got !$OMP")
-		     : G_("Wrong OpenMP continuation at %C: "
-			  "expected !$OMP, got !$ACC"));
+	  if (omp_acc_err_loc.nextc != gfc_current_locus.nextc
+	      || omp_acc_err_loc.lb != gfc_current_locus.lb)
+	    gfc_error_now (is_openmp
+			   ? G_("Wrong OpenACC continuation at %C: "
+				"expected !$ACC, got !$OMP")
+			   : G_("Wrong OpenMP continuation at %C: "
+				"expected !$OMP, got !$ACC"));
+	  omp_acc_err_loc = gfc_current_locus;
+	  goto not_continuation;
 	}
       else if (!openmp_flag && !openacc_flag)
 	for (i = 0; i < 5; i++)
diff --git a/gcc/testsuite/gfortran.dg/goacc-gomp/mixed-1.f b/gcc/testsuite/gfortran.dg/goacc-gomp/mixed-1.f
new file mode 100644
index 00000000000..2e12f1727e4
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/goacc-gomp/mixed-1.f
@@ -0,0 +1,23 @@
+! { dg-additional-options "-fdump-tree-original" }
+
+      ! OMP PARALLEL gets parsed  and is properly handled
+      ! But ACC& gives an error
+      ! [Before: an error is printed but OMP parses 'parallel loop ...']
+      subroutine one
+        implicit none
+        integer i
+!$omp parallel
+!$acc& loop independent  !  { dg-error "Wrong OpenMP continuation at .1.: expected !.OMP, got !.ACC" }
+        do i = 1, 5
+        end do
+!$omp end parallel
+      end
+
+      ! [Before: Bogus 'Wrong OpenMP continuation' as it was read as continuation line!]
+      subroutine two
+!$omp parallel
+!$acc loop independent  !  { dg-error "The !.ACC LOOP directive cannot be specified within a !.OMP PARALLEL region" }
+       do i = 1, 5
+       end do
+!$omp end parallel
+       end
diff --git a/gcc/testsuite/gfortran.dg/goacc/omp-fixed.f b/gcc/testsuite/gfortran.dg/goacc/omp-fixed.f
index 6ce6f73c16b..b1e7affc457 100644
--- a/gcc/testsuite/gfortran.dg/goacc/omp-fixed.f
+++ b/gcc/testsuite/gfortran.dg/goacc/omp-fixed.f
@@ -6,7 +6,7 @@
 
 !$OMP PARALLEL
 !$ACC PARALLEL                                                          &
-!$ACC& COPYIN(ARGC) ! { dg-error "directive cannot be specified within" }
+!$ACC& COPYIN(ARGC)  ! { dg-error "The !.ACC PARALLEL directive cannot be specified within a !.OMP PARALLEL region" }
       IF (ARGC .NE. 0) THEN
          STOP 1
       END IF
@@ -24,9 +24,17 @@
 !$OMP& DO ! { dg-error "Wrong OpenACC continuation" }
       DO I = 1, 10
       ENDDO
+!$ACC END PARALLEL
 
 !$OMP PARALLEL                                                          &
 !$ACC& KERNELS LOOP ! { dg-error "Wrong OpenMP continuation" }
       DO I = 1, 10
       ENDDO
+!$OMP END PARALLEL
+
+!$OMP PARALLEL                                                          &
+!$ACC& LOOP ! { dg-error "Wrong OpenMP continuation" }
+      DO I = 1, 10
+      ENDDO
+!$OMP END PARALLEL
       END SUBROUTINE NI
diff --git a/gcc/testsuite/gfortran.dg/goacc/omp.f95 b/gcc/testsuite/gfortran.dg/goacc/omp.f95
index 8b3b2593217..d8bd886ad9c 100644
--- a/gcc/testsuite/gfortran.dg/goacc/omp.f95
+++ b/gcc/testsuite/gfortran.dg/goacc/omp.f95
@@ -67,8 +67,20 @@ contains
    subroutine nana
      !$acc parallel &
      !$omp do ! { dg-error "Wrong OpenACC continuation" }
+     do i = 1, 5 ! { dg-error "The !.OMP DO directive cannot be specified within a !.ACC PARALLEL region" "" { target *-*-* } .-1 }
+     end do
+     !$acc end parallel
 
      !$omp parallel &
      !$acc kernels loop ! { dg-error "Wrong OpenMP continuation" }
+     do i = 1, 5 ! { dg-error "The !.ACC KERNELS LOOP directive cannot be specified within a !.OMP PARALLEL region" "" { target *-*-* } .-1 }
+     end do
+     !$omp end parallel
+
+     !$omp parallel &
+     !$acc loop ! { dg-error "Wrong OpenMP continuation" }
+     do i = 1, 5 ! { dg-error "The !.ACC LOOP directive cannot be specified within a !.OMP PARALLEL region" "" { target *-*-* } .-1 }
+     end do
+     !$omp end parallel
    end subroutine nana
 end module test


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2021-06-04 15:44 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-06-04 15:44 [gcc r12-1216] Fortran: Fix OpenMP/OpenACC continue-line parsing Tobias Burnus

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).