Hi all,

the attached patch deals with the fact that the Fortran 2018 standard
marks two features as "deleted" (i.e. no longer supported), namely
arithmetic IFs and nonblock DO constructs. Both have been obsolescent
since the 90s (and have been warned about by gfortran with appropriate
flags).

Here's what the patch does:
1) It rejects those features with -std=f2018, giving a hard error.
2) It gives a warning with default flags (previously this happened
only with -std=f2008 etc, but not with -std=gnu).

Note that this does not mean that gfortran completely removes support
for these features, of course. They will continue to be supported with
flags like -std=legacy or -std=f95.

The effect on the gfortran.dg testsuite is moderate, but of course
there are a number of test cases which make use of those features. The
solutions is to compile them with -std=legacy.

The patch regtests cleanly on x86_64-linux-gnu. Ok for trunk?

Cheers,
Janus



2018-05-20  Janus Weil  <ja...@gcc.gnu.org>

    PR fortran/85841
    * match.c (match_arithmetic_if, gfc_match_if): Reject arithmetic if
    in Fortran 2018.
    (gfc_match_stopcode): Adjust checks for standard version.
    * options.c (set_default_std_flags): Warn for F2018 deleted features
    by default.
    (gfc_handle_option): F2018 deleted features are allowed in earlier
    standards.
    * symbol.c (gfc_define_st_label, gfc_reference_st_label): Reject
    nonblock do constructs in Fortran 2018.


2018-05-20  Janus Weil  <ja...@gcc.gnu.org>

    PR fortran/85841
    * gfortran.dg/goacc/loop-1-2.f95: Add option "-std=legacy".
    * gfortran.dg/goacc/loop-1.f95: Ditto.
    * gfortran.dg/gomp/appendix-a/a.6.1.f90: Ditto.
    * gfortran.dg/gomp/appendix-a/a.6.2.f90: Ditto.
    * gfortran.dg/gomp/do-1.f90: Ditto.
    * gfortran.dg/gomp/omp_do1.f90: Ditto.
    * gfortran.dg/pr37243.f: Ditto.
    * gfortran.dg/pr49721-1.f: Ditto.
    * gfortran.dg/pr58484.f: Ditto.
    * gfortran.dg/pr81175.f: Ditto.
    * gfortran.dg/pr81723.f: Ditto.
    * gfortran.dg/predcom-2.f: Ditto.
    * gfortran.dg/vect/Ofast-pr50414.f90: Ditto.
    * gfortran.dg/vect/cost-model-pr34445a.f: Ditto.
    * gfortran.dg/vect/fast-math-mgrid-resid.f: Ditto.
    * gfortran.dg/vect/pr52580.f: Ditto.
Index: gcc/fortran/match.c
===================================================================
--- gcc/fortran/match.c	(revision 260402)
+++ gcc/fortran/match.c	(working copy)
@@ -1442,6 +1442,8 @@ match_arithmetic_if (void)
       return MATCH_ERROR;
     }
 
+  if (!gfc_notify_std (GFC_STD_F2018_DEL, "Arithmetic IF statement at %C"))
+    return MATCH_ERROR;
   if (!gfc_notify_std (GFC_STD_F95_OBS, "Arithmetic IF statement at %C"))
     return MATCH_ERROR;
 
@@ -1522,6 +1524,8 @@ gfc_match_if (gfc_statement *if_type)
 	  return MATCH_ERROR;
 	}
 
+      if (!gfc_notify_std (GFC_STD_F2018_DEL, "Arithmetic IF statement at %C"))
+	return MATCH_ERROR;
       if (!gfc_notify_std (GFC_STD_F95_OBS, "Arithmetic IF statement at %C"))
 	return MATCH_ERROR;
 
@@ -2939,11 +2943,12 @@ gfc_match_stopcode (gfc_statement st)
 
   /* Set f95 for -std=f95.  */
   f95 = gfc_option.allow_std == (GFC_STD_F95_OBS | GFC_STD_F95 | GFC_STD_F77
-				 | GFC_STD_F2008_OBS);
+				 | GFC_STD_F2008_OBS | GFC_STD_F2018_DEL);
 
   /* Set f03 for -std=f2003.  */
   f03 = gfc_option.allow_std == (GFC_STD_F95_OBS | GFC_STD_F95 | GFC_STD_F77
-				 | GFC_STD_F2008_OBS | GFC_STD_F2003);
+				 | GFC_STD_F2008_OBS | GFC_STD_F2003
+				 | GFC_STD_F2018_DEL);
 
   /* Look for a blank between STOP and the stop-code for F2008 or later.  */
   if (gfc_current_form != FORM_FIXED && !(f95 || f03))
Index: gcc/fortran/options.c
===================================================================
--- gcc/fortran/options.c	(revision 260402)
+++ gcc/fortran/options.c	(working copy)
@@ -44,7 +44,7 @@ set_default_std_flags (void)
     | GFC_STD_F2003 | GFC_STD_F2008 | GFC_STD_F95 | GFC_STD_F77
     | GFC_STD_F2008_OBS | GFC_STD_F2008_TS | GFC_STD_GNU | GFC_STD_LEGACY
     | GFC_STD_F2018 | GFC_STD_F2018_DEL | GFC_STD_F2018_OBS;
-  gfc_option.warn_std = GFC_STD_F95_DEL | GFC_STD_LEGACY;
+  gfc_option.warn_std = GFC_STD_F2018_DEL | GFC_STD_F95_DEL | GFC_STD_LEGACY;
 }
 
 
@@ -706,7 +706,7 @@ gfc_handle_option (size_t scode, const char *arg,
 
     case OPT_std_f95:
       gfc_option.allow_std = GFC_STD_F95_OBS | GFC_STD_F95 | GFC_STD_F77
-			     | GFC_STD_F2008_OBS;
+			     | GFC_STD_F2008_OBS | GFC_STD_F2018_DEL;
       gfc_option.warn_std = GFC_STD_F95_OBS;
       gfc_option.max_continue_fixed = 19;
       gfc_option.max_continue_free = 39;
@@ -717,7 +717,7 @@ gfc_handle_option (size_t scode, const char *arg,
 
     case OPT_std_f2003:
       gfc_option.allow_std = GFC_STD_F95_OBS | GFC_STD_F77 
-	| GFC_STD_F2003 | GFC_STD_F95 | GFC_STD_F2008_OBS;
+	| GFC_STD_F2003 | GFC_STD_F95 | GFC_STD_F2008_OBS | GFC_STD_F2018_DEL;
       gfc_option.warn_std = GFC_STD_F95_OBS;
       gfc_option.max_identifier_length = 63;
       warn_ampersand = 1;
@@ -726,7 +726,8 @@ gfc_handle_option (size_t scode, const char *arg,
 
     case OPT_std_f2008:
       gfc_option.allow_std = GFC_STD_F95_OBS | GFC_STD_F77 
-	| GFC_STD_F2003 | GFC_STD_F95 | GFC_STD_F2008 | GFC_STD_F2008_OBS;
+	| GFC_STD_F2003 | GFC_STD_F95 | GFC_STD_F2008 | GFC_STD_F2008_OBS
+	| GFC_STD_F2018_DEL;
       gfc_option.warn_std = GFC_STD_F95_OBS | GFC_STD_F2008_OBS;
       gfc_option.max_identifier_length = 63;
       warn_ampersand = 1;
@@ -736,7 +737,7 @@ gfc_handle_option (size_t scode, const char *arg,
     case OPT_std_f2008ts:
       gfc_option.allow_std = GFC_STD_F95_OBS | GFC_STD_F77 
 	| GFC_STD_F2003 | GFC_STD_F95 | GFC_STD_F2008 | GFC_STD_F2008_OBS
-	| GFC_STD_F2008_TS;
+	| GFC_STD_F2008_TS | GFC_STD_F2018_DEL;
       gfc_option.warn_std = GFC_STD_F95_OBS | GFC_STD_F2008_OBS;
       gfc_option.max_identifier_length = 63;
       warn_ampersand = 1;
Index: gcc/fortran/symbol.c
===================================================================
--- gcc/fortran/symbol.c	(revision 260402)
+++ gcc/fortran/symbol.c	(working copy)
@@ -2721,9 +2721,14 @@ gfc_define_st_label (gfc_st_label *lp, gfc_sl_type
 	    lp->defined = type;
 
 	  if (lp->referenced == ST_LABEL_DO_TARGET && type != ST_LABEL_DO_TARGET
-      	      && !gfc_notify_std (GFC_STD_F95_OBS, "DO termination statement "
-				  "which is not END DO or CONTINUE with "
-				  "label %d at %C", labelno))
+	      && (!gfc_notify_std (GFC_STD_F2018_DEL,
+				   "DO termination statement which is not "
+				   "END DO or CONTINUE with label %d at %C",
+				   labelno) ||
+		  !gfc_notify_std (GFC_STD_F95_OBS,
+				      "DO termination statement which is not "
+				      "END DO or CONTINUE with label %d at %C",
+				      labelno)))
 	    return;
 	  break;
 
@@ -2778,8 +2783,10 @@ gfc_reference_st_label (gfc_st_label *lp, gfc_sl_t
     }
 
   if (lp->referenced == ST_LABEL_DO_TARGET && type == ST_LABEL_DO_TARGET
-      && !gfc_notify_std (GFC_STD_F95_OBS, "Shared DO termination label %d "
-			  "at %C", labelno))
+      && (!gfc_notify_std (GFC_STD_F2018_DEL, "Shared DO termination label %d "
+			   "at %C", labelno) ||
+	  !gfc_notify_std (GFC_STD_F95_OBS, "Shared DO termination label %d "
+			   "at %C", labelno)))
     return false;
 
   if (lp->referenced != ST_LABEL_DO_TARGET)
Index: gcc/testsuite/gfortran.dg/goacc/loop-1-2.f95
===================================================================
--- gcc/testsuite/gfortran.dg/goacc/loop-1-2.f95	(revision 260402)
+++ gcc/testsuite/gfortran.dg/goacc/loop-1-2.f95	(working copy)
@@ -1,4 +1,5 @@
 ! See also loop-1.f95.
+! { dg-additional-options "-std=legacy" }
 
 program test
   call test1
@@ -32,14 +33,12 @@ subroutine test1
   do 300 d = 1, 30, 6
       i = d
   300 a(i) = 1
-  ! { dg-warning "Deleted feature: Loop variable at .1. must be integer" "" { target *-*-* } 32 }
-  ! { dg-error "ACC LOOP iteration variable must be of type integer" "" { target *-*-* } 32 }
+  ! { dg-error "ACC LOOP iteration variable must be of type integer" "" { target *-*-* } 33 }
   !$acc loop
   do d = 1, 30, 5
        i = d
       a(i) = 2
   end do
-  ! { dg-warning "Deleted feature: Loop variable at .1. must be integer" "" { target *-*-* } 38 }
   ! { dg-error "ACC LOOP iteration variable must be of type integer" "" { target *-*-* } 38 }
   !$acc loop
   do i = 1, 30
@@ -150,8 +149,7 @@ subroutine test1
     do i = 1, 3
         do r = 4, 6
         end do
-        ! { dg-warning "Deleted feature: Loop variable at .1. must be integer" "" { target *-*-* } 151 }
-        ! { dg-error "ACC LOOP iteration variable must be of type integer" "" { target *-*-* } 151 }
+        ! { dg-error "ACC LOOP iteration variable must be of type integer" "" { target *-*-* } 150 }
     end do
 
     ! Both seq and independent are not allowed
Index: gcc/testsuite/gfortran.dg/goacc/loop-1.f95
===================================================================
--- gcc/testsuite/gfortran.dg/goacc/loop-1.f95	(revision 260402)
+++ gcc/testsuite/gfortran.dg/goacc/loop-1.f95	(working copy)
@@ -1,4 +1,5 @@
 ! See also loop-1-2.f95.
+! { dg-additional-options "-std=legacy" }
 
 module test
   implicit none
@@ -32,14 +33,12 @@ subroutine test1
   do 300 d = 1, 30, 6
       i = d
   300 a(i) = 1
-  ! { dg-warning "Deleted feature: Loop variable at .1. must be integer" "" { target *-*-* } 32 }
-  ! { dg-error "ACC LOOP iteration variable must be of type integer" "" { target *-*-* } 32 }
+  ! { dg-error "ACC LOOP iteration variable must be of type integer" "" { target *-*-* } 33 }
   !$acc loop
   do d = 1, 30, 5
        i = d
       a(i) = 2
   end do
-  ! { dg-warning "Deleted feature: Loop variable at .1. must be integer" "" { target *-*-* } 38 }
   ! { dg-error "ACC LOOP iteration variable must be of type integer" "" { target *-*-* } 38 }
   !$acc loop
   do i = 1, 30
@@ -150,8 +149,7 @@ subroutine test1
     do i = 1, 3
         do r = 4, 6
         end do
-        ! { dg-warning "Deleted feature: Loop variable at .1. must be integer" "" { target *-*-* } 151 }
-        ! { dg-error "ACC LOOP iteration variable must be of type integer" "" { target *-*-* } 151 }
+        ! { dg-error "ACC LOOP iteration variable must be of type integer" "" { target *-*-* } 150 }
     end do
 
     ! Both seq and independent are not allowed
Index: gcc/testsuite/gfortran.dg/gomp/appendix-a/a.6.1.f90
===================================================================
--- gcc/testsuite/gfortran.dg/gomp/appendix-a/a.6.1.f90	(revision 260402)
+++ gcc/testsuite/gfortran.dg/gomp/appendix-a/a.6.1.f90	(working copy)
@@ -1,4 +1,5 @@
 ! { dg-do compile }
+! { dg-options "-std=legacy" }
 
       SUBROUTINE WORK(I, J)
       INTEGER I,J
Index: gcc/testsuite/gfortran.dg/gomp/appendix-a/a.6.2.f90
===================================================================
--- gcc/testsuite/gfortran.dg/gomp/appendix-a/a.6.2.f90	(revision 260402)
+++ gcc/testsuite/gfortran.dg/gomp/appendix-a/a.6.2.f90	(working copy)
@@ -1,4 +1,5 @@
 ! { dg-do compile }
+! { dg-additional-options "-std=legacy" }
 
         SUBROUTINE WORK(I, J)
         INTEGER I,J
Index: gcc/testsuite/gfortran.dg/gomp/do-1.f90
===================================================================
--- gcc/testsuite/gfortran.dg/gomp/do-1.f90	(revision 260402)
+++ gcc/testsuite/gfortran.dg/gomp/do-1.f90	(working copy)
@@ -1,5 +1,5 @@
 ! { dg-do compile }
-! { dg-options "-O -fopenmp -fdump-tree-omplower" }
+! { dg-options "-O -fopenmp -fdump-tree-omplower -std=legacy" }
 
 subroutine foo (i, j, k, s, a)
   integer :: i, j, k, s, a(100), l
Index: gcc/testsuite/gfortran.dg/gomp/omp_do1.f90
===================================================================
--- gcc/testsuite/gfortran.dg/gomp/omp_do1.f90	(revision 260402)
+++ gcc/testsuite/gfortran.dg/gomp/omp_do1.f90	(working copy)
@@ -1,5 +1,5 @@
 ! { dg-do compile }
-! { dg-options "-fopenmp -std=gnu" }
+! { dg-options "-fopenmp -std=legacy" }
 subroutine foo
   integer :: i, j
   integer, dimension (30) :: a
@@ -24,11 +24,11 @@ subroutine foo
     i = i + 1
   end do
 !$omp do
-  do 300 d = 1, 30, 6 ! { dg-warning "Deleted feature: Loop variable" }
+  do 300 d = 1, 30, 6
     i = d
 300 a(i) = 1
 !$omp do
-  do d = 1, 30, 5 ! { dg-warning "Deleted feature: Loop variable" }
+  do d = 1, 30, 5
     i = d
     a(i) = 2
   end do
Index: gcc/testsuite/gfortran.dg/pr37243.f
===================================================================
--- gcc/testsuite/gfortran.dg/pr37243.f	(revision 260402)
+++ gcc/testsuite/gfortran.dg/pr37243.f	(working copy)
@@ -1,5 +1,6 @@
 ! PR rtl-optimization/37243
 ! { dg-do run }
+! { dg-options "-std=legacy" }
 ! { dg-add-options ieee }
 ! Check if register allocator handles IR flattening correctly.
       SUBROUTINE SCHMD(V,M,N,LDV)
@@ -13,10 +14,10 @@
       DO 160 I = 1,M
       DUMI = ZERO
       DO 100 K = 1,N
-  100 DUMI = DUMI+V(K,I)*V(K,I) ! { dg-warning "Obsolescent feature: DO termination statement which is not END DO or CONTINUE" }
+  100 DUMI = DUMI+V(K,I)*V(K,I)
       DUMI = ONE/ SQRT(DUMI)
       DO 120 K = 1,N
-  120 V(K,I) = V(K,I)*DUMI ! { dg-warning "Obsolescent feature: DO termination statement which is not END DO or CONTINUE" }
+  120 V(K,I) = V(K,I)*DUMI
       IF (I .EQ. M) GO TO 160
       I1 = I+1
       DO 140 J = I1,M
@@ -34,15 +35,15 @@
   220 J = J+1
       IF (J .GT. N) GO TO 320
       DO 240 K = 1,N
-  240 V(K,I) = ZERO ! { dg-warning "Obsolescent feature: DO termination statement which is not END DO or CONTINUE" }
+  240 V(K,I) = ZERO
       CALL DAXPY(N,DUM,V(1,I),1,V(1,I),1)
   260 CONTINUE
       DUMI = ZERO
       DO 280 K = 1,N
-  280 DUMI = DUMI+V(K,I)*V(K,I) ! { dg-warning "Obsolescent feature: DO termination statement which is not END DO or CONTINUE" }
+  280 DUMI = DUMI+V(K,I)*V(K,I)
       IF ( ABS(DUMI) .LT. TOL) GO TO 220
       DO 300 K = 1,N
-  300 V(K,I) = V(K,I)*DUMI ! { dg-warning "Obsolescent feature: DO termination statement which is not END DO or CONTINUE" }
+  300 V(K,I) = V(K,I)*DUMI
       GO TO 200
   320 END
       program main
Index: gcc/testsuite/gfortran.dg/pr49721-1.f
===================================================================
--- gcc/testsuite/gfortran.dg/pr49721-1.f	(revision 260402)
+++ gcc/testsuite/gfortran.dg/pr49721-1.f	(working copy)
@@ -1,6 +1,6 @@
 ! PR middle-end/49721
 ! { dg-do compile }
-! { dg-options "-O3 -funroll-loops" }
+! { dg-options "-O3 -funroll-loops -std=legacy" }
 
       subroutine midbloc6(c,a2,a2i,q)
       parameter (ndim2=6)
Index: gcc/testsuite/gfortran.dg/pr58484.f
===================================================================
--- gcc/testsuite/gfortran.dg/pr58484.f	(revision 260402)
+++ gcc/testsuite/gfortran.dg/pr58484.f	(working copy)
@@ -1,5 +1,5 @@
 ! { dg-do compile }
-! { dg-options "-O2" }
+! { dg-options "-O2 -std=legacy" }
       SUBROUTINE UMPSE(AIBJ,NOC,NDIM,NOCA,NVIRA,NOCCA,E2)
       DIMENSION AIBJ(NOC,NDIM,*)
       DO 20 MA=1,NVIRA
Index: gcc/testsuite/gfortran.dg/pr81175.f
===================================================================
--- gcc/testsuite/gfortran.dg/pr81175.f	(revision 260402)
+++ gcc/testsuite/gfortran.dg/pr81175.f	(working copy)
@@ -1,5 +1,5 @@
 ! { dg-do compile }
-! { dg-options "-Ofast -fwrapv" }
+! { dg-options "-Ofast -fwrapv -std=legacy" }
 ! { dg-additional-options "-march=broadwell" { target x86_64-*-* i?86-*-* } }
       SUBROUTINE ECPDRA(IC4C,FP,FQ,G)
       IMPLICIT DOUBLE PRECISION (A-H,O-Z)
Index: gcc/testsuite/gfortran.dg/pr81723.f
===================================================================
--- gcc/testsuite/gfortran.dg/pr81723.f	(revision 260402)
+++ gcc/testsuite/gfortran.dg/pr81723.f	(working copy)
@@ -1,5 +1,5 @@
 ! { dg-do compile }
-! { dg-options "-O3 -fno-automatic" }
+! { dg-options "-O3 -fno-automatic -std=legacy" }
 
       FUNCTION WWERF(Z)
 
Index: gcc/testsuite/gfortran.dg/predcom-2.f
===================================================================
--- gcc/testsuite/gfortran.dg/predcom-2.f	(revision 260402)
+++ gcc/testsuite/gfortran.dg/predcom-2.f	(working copy)
@@ -1,7 +1,7 @@
 ! PR 32220, ICE when the loop is not unrolled enough to eliminate all 
 !   register copies
 ! { dg-do compile }
-! { dg-options "-O3" }
+! { dg-options "-O3 -std=legacy" }
 
       subroutine derv (b,cosxy,thick)
 c
Index: gcc/testsuite/gfortran.dg/vect/Ofast-pr50414.f90
===================================================================
--- gcc/testsuite/gfortran.dg/vect/Ofast-pr50414.f90	(revision 260402)
+++ gcc/testsuite/gfortran.dg/vect/Ofast-pr50414.f90	(working copy)
@@ -1,4 +1,5 @@
 ! { dg-do compile }
+! { dg-options "-std=legacy" }
 
       SUBROUTINE  SUB  (A,L,YMAX)
       DIMENSION A(L)
Index: gcc/testsuite/gfortran.dg/vect/cost-model-pr34445a.f
===================================================================
--- gcc/testsuite/gfortran.dg/vect/cost-model-pr34445a.f	(revision 260402)
+++ gcc/testsuite/gfortran.dg/vect/cost-model-pr34445a.f	(working copy)
@@ -1,4 +1,5 @@
 c { dg-do compile }
+c { dg-options "-std=legacy" }
       subroutine derv (xx,b,bv,det,r,s,t,ndopt,cosxy,thick,edis,
      1                  vni,vnt)
       implicit real*8 (a-h,o-z)
Index: gcc/testsuite/gfortran.dg/vect/fast-math-mgrid-resid.f
===================================================================
--- gcc/testsuite/gfortran.dg/vect/fast-math-mgrid-resid.f	(revision 260402)
+++ gcc/testsuite/gfortran.dg/vect/fast-math-mgrid-resid.f	(working copy)
@@ -1,6 +1,6 @@
 ! { dg-do compile }
 ! { dg-require-effective-target vect_double }
-! { dg-options "-O3 --param vect-max-peeling-for-alignment=0 -fpredictive-commoning -fdump-tree-pcom-details" }
+! { dg-options "-O3 --param vect-max-peeling-for-alignment=0 -fpredictive-commoning -fdump-tree-pcom-details -std=legacy" }
 ! { dg-additional-options "-mprefer-avx128" { target { i?86-*-* x86_64-*-* } } }
 ! { dg-additional-options "-mzarch" { target { s390*-*-* } } }
 
Index: gcc/testsuite/gfortran.dg/vect/pr52580.f
===================================================================
--- gcc/testsuite/gfortran.dg/vect/pr52580.f	(revision 260402)
+++ gcc/testsuite/gfortran.dg/vect/pr52580.f	(working copy)
@@ -1,4 +1,5 @@
 ! { dg-do compile }
+! { dg-options "-std=legacy" }
 ! { dg-require-effective-target vect_double }
       SUBROUTINE CALC2
       IMPLICIT REAL*8	(A-H, O-Z)

Reply via email to