From e79e6763c68224a1b0d272d32697702faee7e427 Mon Sep 17 00:00:00 2001 From: Fritz Reese Date: Mon, 19 Sep 2016 11:32:09 +0000 Subject: [PATCH] re PR fortran/77584 (Unclassifiable statement error with procedure pointer using template named "structure_") 2016-09-19 Fritz Reese PR fortran/77584 * gcc/fortran/decl.c (match_record_decl, gfc_match_decl_type_spec): Fixes to handling of structure/record from declaration-type-spec. * gcc/testsuite/gfortran.dg/dec_structure_15.f90: New testcase. From-SVN: r240230 --- gcc/fortran/ChangeLog | 6 ++++ gcc/fortran/decl.c | 65 ++++++++++++++++++++++------------------- gcc/testsuite/ChangeLog | 5 ++++ 3 files changed, 46 insertions(+), 30 deletions(-) diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 611699f3ac2..973f615b6b4 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,9 @@ +2016-09-19 Fritz Reese + + PR fortran/77584 + * decl.c (match_record_decl, gfc_match_decl_type_spec): Fixes to + handling of structure/record from declaration-type-spec. + 2016_09_17 Louis Krupp PR fortran/68078 diff --git a/gcc/fortran/decl.c b/gcc/fortran/decl.c index c83e9d4d791..d9fae5753d0 100644 --- a/gcc/fortran/decl.c +++ b/gcc/fortran/decl.c @@ -2909,12 +2909,14 @@ done: /* Matches a RECORD declaration. */ static match -match_record_decl (const char *name) +match_record_decl (char *name) { locus old_loc; old_loc = gfc_current_locus; + match m; - if (gfc_match (" record") == MATCH_YES) + m = gfc_match (" record /"); + if (m == MATCH_YES) { if (!gfc_option.flag_dec_structure) { @@ -2923,17 +2925,20 @@ match_record_decl (const char *name) "-fdec-structure"); return MATCH_ERROR; } - if (gfc_match (" /%n/", name) != MATCH_YES) - { - gfc_error ("Structure name expected after RECORD at %C"); - gfc_current_locus = old_loc; - return MATCH_ERROR; - } - return MATCH_YES; + m = gfc_match (" %n/", name); + if (m == MATCH_YES) + return MATCH_YES; } - gfc_current_locus = old_loc; + gfc_current_locus = old_loc; + if (gfc_option.flag_dec_structure + && (gfc_match (" record% ") == MATCH_YES + || gfc_match (" record%t") == MATCH_YES)) + gfc_error ("Structure name expected after RECORD at %C"); + if (m == MATCH_NO) return MATCH_NO; + + return MATCH_ERROR; } /* Matches a declaration-type-spec (F03:R502). If successful, sets the ts @@ -3128,26 +3133,26 @@ gfc_match_decl_type_spec (gfc_typespec *ts, int implicit_flag) else { /* Match nested STRUCTURE declarations; only valid within another - structure declaration. */ - m = gfc_match (" structure"); - if (m == MATCH_ERROR) - return MATCH_ERROR; - else if (m == MATCH_YES) - { - if ( gfc_current_state () != COMP_STRUCTURE - && gfc_current_state () != COMP_MAP) - return MATCH_ERROR; - - m = gfc_match_structure_decl (); - if (m == MATCH_YES) - { - /* gfc_new_block is updated by match_structure_decl. */ - ts->type = BT_DERIVED; - ts->u.derived = gfc_new_block; - return MATCH_YES; - } - return MATCH_ERROR; - } + structure declaration. */ + if (gfc_option.flag_dec_structure + && (gfc_current_state () == COMP_STRUCTURE + || gfc_current_state () == COMP_MAP)) + { + m = gfc_match (" structure"); + if (m == MATCH_YES) + { + m = gfc_match_structure_decl (); + if (m == MATCH_YES) + { + /* gfc_new_block is updated by match_structure_decl. */ + ts->type = BT_DERIVED; + ts->u.derived = gfc_new_block; + return MATCH_YES; + } + } + if (m == MATCH_ERROR) + return MATCH_ERROR; + } /* Match CLASS declarations. */ m = gfc_match (" class ( * )"); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 1077e173e92..6edcc7d5f27 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2016-09-19 Fritz Reese + + PR fortran/77584 + * gfortran.dg/dec_structure_15.f90: New testcase. + 2016-09-19 Richard Biener PR middle-end/77605