re PR fortran/77584 (Unclassifiable statement error with procedure pointer using...
authorFritz Reese <fritzoreese@gmail.com>
Mon, 19 Sep 2016 11:32:09 +0000 (11:32 +0000)
committerFritz Reese <foreese@gcc.gnu.org>
Mon, 19 Sep 2016 11:32:09 +0000 (11:32 +0000)
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

gcc/fortran/ChangeLog
gcc/fortran/decl.c
gcc/testsuite/ChangeLog

index 611699f3ac2efcefd479a111947a82b040b9e1d8..973f615b6b47ace52c57cc5d2f1db8e8e5a1dea2 100644 (file)
@@ -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
index c83e9d4d7915c140e4668627120dc200e6959f8e..d9fae5753d07b66052dda56f432267d48283d512 100644 (file)
@@ -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 ( * )");
index 1077e173e923bfc33fd934193113d3db23b04f48..6edcc7d5f2778192ff834c6c25f8dc9086e9740b 100644 (file)
@@ -1,3 +1,8 @@
+2016-09-19  Fritz Reese  <fritzoreese@gmail.com>
+
+       PR fortran/77584
+       * gfortran.dg/dec_structure_15.f90: New testcase.
+
 2016-09-19  Richard Biener  <rguenther@suse.de>
 
        PR middle-end/77605