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)