aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran
diff options
context:
space:
mode:
authorFritz Reese <fritzoreese@gmail.com>2016-09-19 11:32:09 +0000
committerFritz Reese <foreese@gcc.gnu.org>2016-09-19 11:32:09 +0000
commite79e6763c68224a1b0d272d32697702faee7e427 (patch)
tree609f2201869c0073283c95c7cb96e2e43e0136a1 /gcc/fortran
parent471a0d47ae10724631be478381821544932db99f (diff)
downloadgcc-e79e6763c68224a1b0d272d32697702faee7e427.zip
gcc-e79e6763c68224a1b0d272d32697702faee7e427.tar.gz
gcc-e79e6763c68224a1b0d272d32697702faee7e427.tar.bz2
re PR fortran/77584 (Unclassifiable statement error with procedure pointer using template named "structure_")
2016-09-19 Fritz Reese <fritzoreese@gmail.com> 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
Diffstat (limited to 'gcc/fortran')
-rw-r--r--gcc/fortran/ChangeLog6
-rw-r--r--gcc/fortran/decl.c65
2 files changed, 41 insertions, 30 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 611699f..973f615 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,9 @@
+2016-09-19 Fritz Reese <fritzoreese@gmail.com>
+
+ 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 <louis.krupp@zoho.com>
PR fortran/68078
diff --git a/gcc/fortran/decl.c b/gcc/fortran/decl.c
index c83e9d4..d9fae57 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 ( * )");