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 <ja...@gcc.gnu.org> 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 <ja...@gcc.gnu.org> 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 <ja...@gcc.gnu.org> 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