From 1ac0ac8b905ca91a7b5b8af907237133d65f2a5c Mon Sep 17 00:00:00 2001 From: "James A. Morrison" Date: Tue, 30 Nov 2004 00:32:34 +0000 Subject: [PATCH] re PR c/18596 (ICE in make_decl_rtl) 2004-11-26 James A. Morrison 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 --- gcc/ChangeLog | 6 ++++++ gcc/c-decl.c | 18 +++++++++++++----- gcc/testsuite/ChangeLog | 4 ++++ gcc/testsuite/gcc.dg/pr18596-1.c | 7 +++++++ 4 files changed, 30 insertions(+), 5 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/pr18596-1.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 2f285dae98f..e2e6d82a031 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2004-11-30 James A. Morrison + + PR middle-end/18596 + * c-decl.c (grokdeclarator): Reset DECL_INTIAL to error_mark_node + on errors. + 2004-11-30 Richard Kenner * expr.c (expand_expr_real_1, case NOP_EXPR): Properly handle diff --git a/gcc/c-decl.c b/gcc/c-decl.c index 3c8dbeef733..ea26da44a3c 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 f45e21b2e1f..981a45ca199 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2004-11-30 James A. Morrison + + * gcc.dg/pr18596-1.c: New test. + 2004-11-30 Ben Elliston * 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 00000000000..055d60a4a75 --- /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(); +}