Fix ICE and improve errors for invalid anonymous structure declarations.
authorFritz O. Reese <fritzoreese@gmail.com>
Thu, 10 Nov 2016 21:57:13 +0000 (21:57 +0000)
committerFritz Reese <foreese@gcc.gnu.org>
Thu, 10 Nov 2016 21:57:13 +0000 (21:57 +0000)
PR fortran/78277
* gcc/fortran/decl.c (gfc_match_data_decl): Gracefully handle bad
anonymous structure declarations.

PR fortran/78277
* gcc/testsuite/gfortran.dg/dec_structure_17.f90: New test.

From-SVN: r242058

gcc/fortran/ChangeLog
gcc/fortran/decl.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/dec_structure_17.f90 [new file with mode: 0644]

index 0872b4943275cee76cd2c12b4b998a60977a5fbf..ae8f661ff534376b1d6617a24a1b234149be369d 100644 (file)
@@ -1,3 +1,9 @@
+2016-11-10  Fritz O. Reese <fritzoreese@gmail.com>
+
+       PR fortran/78277
+       * gcc/fortran/decl.c (gfc_match_data_decl): Gracefully handle bad
+       anonymous structure declarations.
+
 2016-11-10  Fritz O. Reese <fritzoreese@gmail.com>
 
        * decl.c (get_struct_decl, gfc_match_map, gfc_match_union): Fix
index 1272f1fe52957121f1c0e2e73cf5e0893f6c0eec..bf6bc2467098558054cd58aaa07267164bd9b5b2 100644 (file)
@@ -4901,7 +4901,28 @@ ok:
     }
 
   if (!gfc_error_flag_test ())
-    gfc_error ("Syntax error in data declaration at %C");
+    {
+      /* An anonymous structure declaration is unambiguous; if we matched one
+        according to gfc_match_structure_decl, we need to return MATCH_YES
+        here to avoid confusing the remaining matchers, even if there was an
+        error during variable_decl.  We must flush any such errors.  Note this
+        causes the parser to gracefully continue parsing the remaining input
+        as a structure body, which likely follows.  */
+      if (current_ts.type == BT_DERIVED && current_ts.u.derived
+         && gfc_fl_struct (current_ts.u.derived->attr.flavor))
+       {
+         gfc_error_now ("Syntax error in anonymous structure declaration"
+                        " at %C");
+         /* Skip the bad variable_decl and line up for the start of the
+            structure body.  */
+         gfc_error_recovery ();
+         m = MATCH_YES;
+         goto cleanup;
+       }
+
+      gfc_error ("Syntax error in data declaration at %C");
+    }
+
   m = MATCH_ERROR;
 
   gfc_free_data_all (gfc_current_ns);
index 6c82dbf281299749b445e9ab00f4257be304f669..e16fdde8db969bc7f76897752e481edc41e8d08b 100644 (file)
@@ -1,3 +1,8 @@
+2016-11-10  Fritz O. Reese <fritzoreese@gmail.com>
+
+       PR fortran/78277
+       * gfortran.dg/dec_structure_17.f90: New test.
+
 2016-11-10  Michael Meissner  <meissner@linux.vnet.ibm.com>
 
        * gcc.target/powerpc/vsx-qimode.c: New test for QImode, HImode
diff --git a/gcc/testsuite/gfortran.dg/dec_structure_17.f90 b/gcc/testsuite/gfortran.dg/dec_structure_17.f90
new file mode 100644 (file)
index 0000000..18d3193
--- /dev/null
@@ -0,0 +1,27 @@
+! { dg-do compile }
+! { dg-options "-fdec-structure" }
+!
+! PR fortran/78277
+!
+! Fix ICE for invalid structure declaration code.
+!
+
+subroutine sub1()
+  structure /s/
+    structure t
+      integer i
+    end structure
+  end structure
+  record /s/ u
+  interface
+    subroutine sub0(u)
+      structure /s/
+        structure t. ! { dg-error "Syntax error in anonymous structure decl" }
+          integer i
+        end structure
+      end structure
+      record /s/ u
+    end
+  end interface
+  call sub0(u)
+end