aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJames A. Morrison <phython@gcc.gnu.org>2004-11-30 00:32:34 +0000
committerJames A. Morrison <phython@gcc.gnu.org>2004-11-30 00:32:34 +0000
commit1ac0ac8b905ca91a7b5b8af907237133d65f2a5c (patch)
tree576efc3fd518c2953b5a4114998ec54ad0f7f78e /gcc
parent1590d64e4f83b44daa382d1f2efa8f2d587304d3 (diff)
downloadgcc-1ac0ac8b905ca91a7b5b8af907237133d65f2a5c.zip
gcc-1ac0ac8b905ca91a7b5b8af907237133d65f2a5c.tar.gz
gcc-1ac0ac8b905ca91a7b5b8af907237133d65f2a5c.tar.bz2
re PR c/18596 (ICE in make_decl_rtl)
2004-11-26 James A. Morrison <phython@gcc.gnu.org> 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. From-SVN: r91504
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/c-decl.c18
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.dg/pr18596-1.c7
4 files changed, 30 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 2f285da..e2e6d82 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/c-decl.c b/gcc/c-decl.c
index 3c8dbee..ea26da4 100644
--- a/gcc/c-decl.c
+++ b/gcc/c-decl.c
@@ -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))
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index f45e21b..981a45c 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..055d60a
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr18596-1.c
@@ -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();
+}