OSDN Git Service

2003-12-22 Andrew Pinski <pinskia@physics.uc.edu>
authorpinskia <pinskia@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 22 Dec 2003 18:16:56 +0000 (18:16 +0000)
committerpinskia <pinskia@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 22 Dec 2003 18:16:56 +0000 (18:16 +0000)
        PR c/9163
        * c-decl.c (poplevel): Only set DECL_INITIAL of a current function
        if it is non-null.
        (finish_function): Check for error_mark_node or null on DECL_RESULT and
        DECL_RESULT of fndecl.
        (c_expand_body): Only expand when DECL_INITIAL of fndecl is not
        error_mark_node and not null.

2003-12-22  Andrew Pinski  <pinskia@physics.uc.edu>

       PR c/9163
       * gcc.dg/20031222-1.c: New test.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@74934 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/c-decl.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/20031222-1.c [new file with mode: 0644]

index 9c94cf1..60244ba 100644 (file)
@@ -1,3 +1,13 @@
+2003-12-22  Andrew Pinski  <pinskia@physics.uc.edu>
+
+       PR c/9163
+       * c-decl.c (poplevel): Only set DECL_INITIAL of a current function
+       if it is non-null.
+       (finish_function): Check for error_mark_node or null on DECL_RESULT and
+       DECL_RESULT of fndecl.
+       (c_expand_body): Only expand when DECL_INITIAL of fndecl is not
+       error_mark_node and not null.
+
 2003-12-21  Dan Nicolaescu  <dann@ics.uci.edu>
 
        * rtl.h (dump_rtx_statistics): Declare it.
index 7e426ab..65e7176 100644 (file)
@@ -676,7 +676,7 @@ poplevel (int keep, int dummy ATTRIBUTE_UNUSED, int functionbody)
     IDENTIFIER_TAG_VALUE (TREE_PURPOSE (p)) = TREE_VALUE (p);
 
   /* Dispose of the block that we just made inside some higher level.  */
-  if (scope->function_body)
+  if (scope->function_body && current_function_decl)
     DECL_INITIAL (current_function_decl) = block;
   else if (scope->outer)
     {
@@ -6088,11 +6088,13 @@ finish_function (void)
        }
     }
 
-  BLOCK_SUPERCONTEXT (DECL_INITIAL (fndecl)) = fndecl;
+  if (DECL_INITIAL (fndecl) != error_mark_node && DECL_INITIAL (fndecl))
+    BLOCK_SUPERCONTEXT (DECL_INITIAL (fndecl)) = fndecl;
 
   /* Must mark the RESULT_DECL as being in this function.  */
 
-  DECL_CONTEXT (DECL_RESULT (fndecl)) = fndecl;
+  if (DECL_RESULT (fndecl) != error_mark_node && DECL_RESULT (fndecl))
+    DECL_CONTEXT (DECL_RESULT (fndecl)) = fndecl;
 
   if (MAIN_NAME_P (DECL_NAME (fndecl)) && flag_hosted)
     {
@@ -6192,7 +6194,7 @@ c_expand_body_1 (tree fndecl, int nested_p)
       /* Squirrel away our current state.  */
       push_function_context ();
     }
-
+    
   tree_rest_of_compilation (fndecl, nested_p);
 
   if (nested_p)
@@ -6223,7 +6225,9 @@ c_expand_body_1 (tree fndecl, int nested_p)
 void
 c_expand_body (tree fndecl)
 {
-  c_expand_body_1 (fndecl, 0);
+
+  if (DECL_INITIAL (fndecl) != error_mark_node && DECL_INITIAL (fndecl))
+    c_expand_body_1 (fndecl, 0);
 }
 \f
 /* Check the declarations given in a for-loop for satisfying the C99
index d96d8c6..3d9d88a 100644 (file)
@@ -1,3 +1,8 @@
+2003-12-22  Andrew Pinski  <pinskia@physics.uc.edu>
+
+       PR c/9163
+       * gcc.dg/20031222-1.c: New test.
+
 2003-12-21  Mark Mitchell  <mark@codesourcery.com>
 
        PR c++/13438
diff --git a/gcc/testsuite/gcc.dg/20031222-1.c b/gcc/testsuite/gcc.dg/20031222-1.c
new file mode 100644 (file)
index 0000000..b0d1a2d
--- /dev/null
@@ -0,0 +1,18 @@
+/* PR c/9163 */
+/* The following test used to ICE after an error message in C99 mode
+   because GCC was trying to expand the tree to rtl.  */
+
+/* { dg-do compile } */
+/* { dg-options "-std=c99" } */
+
+
+
+void f ()
+{
+       for (; int ; ); /* { dg-error "" } */
+}
+
+void foo ()
+{
+        while (int i); /* { dg-error "" } */
+}