Hi all,
just because 2018 seems like a good time to do that, I continue
plucking some of the low-hanging Fortran 2018 fruit. The attached
patch adds obsolescence warnings for all major F18 obsolescences
(COMMON, BLOCK DATA, EQUIVALENCE, FORALL, labeled DO). Those warnings
appear only with -std=f2018, but not with gfortran's default -std=gnu.
They currently have zero impact on the gfortran test suite, so I'm
adding a new test case to check for their existence.
Regtests cleanly on x86_64-linux-gnu. Ok for trunk?
Cheers,
Janus
2018-05-24 Janus Weil <[email protected]>
PR fortran/85839
* match.c (gfc_match_block_data): Call gfc_notify_std to warn about
an obsolescent feature in Fortran 2018.
(gfc_match_equivalence): Ditto.
* resolve.c (resolve_common_blocks): Ditto.
(gfc_resolve_forall): Ditto.
* symbol.c (gfc_define_st_label): Ditto.
2018-05-24 Janus Weil <[email protected]>
PR fortran/85839
* gfortran.dg/f2018_obs.f90: New test case.
Index: gcc/fortran/match.c
===================================================================
--- gcc/fortran/match.c (revision 260623)
+++ gcc/fortran/match.c (working copy)
@@ -5259,6 +5259,10 @@ gfc_match_block_data (void)
gfc_symbol *sym;
match m;
+ if (!gfc_notify_std (GFC_STD_F2018_OBS, "BLOCK DATA construct at %L",
+ &gfc_current_locus))
+ return MATCH_ERROR;
+
if (gfc_match_eos () == MATCH_YES)
{
gfc_new_block = NULL;
@@ -5575,6 +5579,9 @@ gfc_match_equivalence (void)
}
}
+ if (!gfc_notify_std (GFC_STD_F2018_OBS, "EQUIVALENCE statement at %C"))
+ return MATCH_ERROR;
+
return MATCH_YES;
syntax:
Index: gcc/fortran/resolve.c
===================================================================
--- gcc/fortran/resolve.c (revision 260623)
+++ gcc/fortran/resolve.c (working copy)
@@ -997,6 +997,10 @@ resolve_common_blocks (gfc_symtree *common_root)
resolve_common_vars (common_root->n.common, true);
+ if (!gfc_notify_std (GFC_STD_F2018_OBS, "COMMON block at %L",
+ &common_root->n.common->where))
+ return;
+
/* The common name is a global name - in Fortran 2003 also if it has a
C binding name, since Fortran 2008 only the C binding name is a global
identifier. */
@@ -9928,6 +9932,9 @@ gfc_resolve_forall (gfc_code *code, gfc_namespace
old_nvar = nvar;
+ if (!gfc_notify_std (GFC_STD_F2018_OBS, "FORALL construct at %L", &code->loc))
+ return;
+
/* Start to resolve a FORALL construct */
if (forall_save == 0)
{
Index: gcc/fortran/symbol.c
===================================================================
--- gcc/fortran/symbol.c (revision 260623)
+++ gcc/fortran/symbol.c (working copy)
@@ -2725,6 +2725,10 @@ gfc_define_st_label (gfc_st_label *lp, gfc_sl_type
"DO termination statement which is not END DO"
" or CONTINUE with label %d at %C", labelno))
return;
+ if (type == ST_LABEL_DO_TARGET
+ && !gfc_notify_std (GFC_STD_F2018_OBS, "Labeled DO statement "
+ "at %L", label_locus))
+ return;
break;
default:
! { dg-do compile }
! { dg-do options "-std=f2018" }
!
! PR 85839: [F2018] warn for obsolescent features
!
! Contributed by Janus Weil <[email protected]>
block data ! { dg-warning "obsolescent feature" }
common /a/ y(3) ! { dg-warning "obsolescent feature" }
data y /3*1./
end
program f2018_obs
implicit none
integer :: a(10),b(10),j(8),i
real :: x(3)
common /c/ x ! { dg-warning "obsolescent feature" }
equivalence (a(10),b(1)) ! { dg-warning "obsolescent feature" }
do 99 i=1,10
99 continue ! { dg-warning "obsolescent feature" }
j = (/ 0, 1, 2, 3, 4, 0, 6, 7 /)
forall (i=1:8, j(i) /= 0) ! { dg-warning "obsolescent feature" }
j(i) = 0
end forall
end