OSDN Git Service

2004-11-26 James A. Morrison <phython@gcc.gnu.org>
authorphython <phython@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 30 Nov 2004 00:32:34 +0000 (00:32 +0000)
committerphython <phython@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 30 Nov 2004 00:32:34 +0000 (00:32 +0000)
        PR middle-end/18596
        * c-decl.c (grokdeclarator): Reset DECL_INTIAL to error_mark_node
        on errors.

testsuite:
        * gcc.dg/pr18596-1.c: New test.

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

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

index 2f285da..e2e6d82 100644 (file)
@@ -1,3 +1,9 @@
+2004-11-30  James A. Morrison  <phython@gcc.gnu.org>
+
+       PR middle-end/18596
+       * c-decl.c (grokdeclarator): Reset DECL_INTIAL to error_mark_node
+       on errors.
+
 2004-11-30  Richard Kenner  <kenner@vlsi1.ultra.nyu.edu>
 
        * expr.c (expand_expr_real_1, case NOP_EXPR): Properly handle
index 3c8dbee..ea26da4 100644 (file)
@@ -4428,8 +4428,15 @@ grokdeclarator (const struct c_declarator *declarator,
       }
     else if (TREE_CODE (type) == FUNCTION_TYPE)
       {
+       decl = build_decl (FUNCTION_DECL, declarator->u.id, type);
+       decl = build_decl_attribute_variant (decl, decl_attr);
+
        if (storage_class == csc_register || threadp)
-         error ("invalid storage class for function %qs", name);
+         {
+           error ("invalid storage class for function %qs", name);
+           if (DECL_INITIAL (decl) != NULL_TREE)
+             DECL_INITIAL (decl) = error_mark_node;
+          }
        else if (current_scope != file_scope)
          {
            /* Function declaration not at file scope.  Storage
@@ -4443,12 +4450,13 @@ grokdeclarator (const struct c_declarator *declarator,
                  pedwarn ("invalid storage class for function %qs", name);
              }
            if (storage_class == csc_static)
-             error ("invalid storage class for function %qs", name);
+             {
+               error ("invalid storage class for function %qs", name);
+               if (DECL_INITIAL (decl) != NULL_TREE)
+                 DECL_INITIAL (decl) = error_mark_node;
+             }
          }
 
-       decl = build_decl (FUNCTION_DECL, declarator->u.id, type);
-       decl = build_decl_attribute_variant (decl, decl_attr);
-
        DECL_LANG_SPECIFIC (decl) = GGC_CNEW (struct lang_decl);
 
        if (pedantic && type_quals && !DECL_IN_SYSTEM_HEADER (decl))
index f45e21b..981a45c 100644 (file)
@@ -1,3 +1,7 @@
+2004-11-30  James A. Morrison  <phython@gcc.gnu.org>
+
+       * gcc.dg/pr18596-1.c: New test.
+
 2004-11-30  Ben Elliston  <bje@au.ibm.com>
 
        * g++.old-deja/g++.other/decl5.C: Remove remaining XFAILs.
diff --git a/gcc/testsuite/gcc.dg/pr18596-1.c b/gcc/testsuite/gcc.dg/pr18596-1.c
new file mode 100644 (file)
index 0000000..055d60a
--- /dev/null
@@ -0,0 +1,7 @@
+/* { dg-do compile } */
+int f(int i)
+{
+  static int g(); /* { dg-warning "invalid storage class" } */
+  static int g() { return i; } /* { dg-warning "invalid storage class" } */
+  return g();
+}