re PR c/18596 (ICE in make_decl_rtl)

2004-12-19  James A. Morrison  <phython@gcc.gnu.org>

       PR c/18596
       * c-parse.in (initdcl): Don't process a declaration if start_decl fails.
       (notype_initdcl):  Don't process a declaration if start_decl fails.
       * c-decl.c (start_decl): Fail if grokdeclarator fails.
       (grokdeclarator): Fail if a function definition has an invalid storage
       class.
       * c-typeck.c (start_init): Treat error_mark_node the same as 0.

testsuite:
        PR c/18596
        * gcc.dg/funcdef-storage-1.c (foo): Remove.
        * gcc.dg/pr18596-1.c: Use dg-error.
        (dg-options): Use -fno-unit-at-a-time.
        * gcc.dg/pr18596-2.c: New test.
        * gcc.dg/pr18596-3.c: New test.

From-SVN: r92459
This commit is contained in:
James A. Morrison 2004-12-21 17:01:08 +00:00
parent 41afe4ef3e
commit 6f17bbcf05
9 changed files with 137 additions and 23 deletions

View File

@ -1,3 +1,13 @@
2004-12-21 James A. Morrison <phython@gcc.gnu.org>
PR c/18596
* c-parse.in (initdcl): Don't process a declaration if start_decl fails.
(notype_initdcl): Don't process a declaration if start_decl fails.
* c-decl.c (start_decl): Fail if grokdeclarator fails.
(grokdeclarator): Fail if a function definition has an invalid storage
class.
* c-typeck.c (start_init): Treat error_mark_node the same as 0.
2004-12-21 Richard Henderson <rth@redhat.com>
* config/i386/i386.c (x86_sse_split_regs): Rename from

View File

@ -2964,6 +2964,8 @@ start_decl (struct c_declarator *declarator, struct c_declspecs *declspecs,
decl = grokdeclarator (declarator, declspecs,
NORMAL, initialized, NULL);
if (!decl)
return 0;
deprecated_state = DEPRECATED_NORMAL;
@ -4437,14 +4439,9 @@ 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);
if (DECL_INITIAL (decl) != NULL_TREE)
DECL_INITIAL (decl) = error_mark_node;
}
else if (current_scope != file_scope)
{
@ -4458,14 +4455,19 @@ grokdeclarator (const struct c_declarator *declarator,
if (pedantic)
pedwarn ("invalid storage class for function %qs", name);
}
if (storage_class == csc_static)
else if (storage_class == csc_static)
{
error ("invalid storage class for function %qs", name);
if (DECL_INITIAL (decl) != NULL_TREE)
DECL_INITIAL (decl) = error_mark_node;
if (funcdef_flag)
storage_class = declspecs->storage_class = csc_none;
else
return 0;
}
}
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))

View File

@ -1321,16 +1321,23 @@ initdcl:
declarator maybeasm maybe_attribute '='
{ $<ttype>$ = start_decl ($1, current_declspecs, true,
chainon ($3, all_prefix_attributes));
if (!$<ttype>$)
$<ttype>$ = error_mark_node;
start_init ($<ttype>$, $2, global_bindings_p ()); }
init
/* Note how the declaration of the variable is in effect while its init is parsed! */
{ finish_init ();
maybe_warn_string_init (TREE_TYPE ($<ttype>5), $6);
finish_decl ($<ttype>5, $6.value, $2); }
if ($<ttype>5 != error_mark_node)
{
maybe_warn_string_init (TREE_TYPE ($<ttype>5), $6);
finish_decl ($<ttype>5, $6.value, $2);
}
}
| declarator maybeasm maybe_attribute
{ tree d = start_decl ($1, current_declspecs, false,
chainon ($3, all_prefix_attributes));
finish_decl (d, NULL_TREE, $2);
if (d)
finish_decl (d, NULL_TREE, $2);
}
;
@ -1338,16 +1345,23 @@ notype_initdcl:
notype_declarator maybeasm maybe_attribute '='
{ $<ttype>$ = start_decl ($1, current_declspecs, true,
chainon ($3, all_prefix_attributes));
if (!$<ttype>$)
$<ttype>$ = error_mark_node;
start_init ($<ttype>$, $2, global_bindings_p ()); }
init
/* Note how the declaration of the variable is in effect while its init is parsed! */
{ finish_init ();
maybe_warn_string_init (TREE_TYPE ($<ttype>5), $6);
finish_decl ($<ttype>5, $6.value, $2); }
if ($<ttype>5 != error_mark_node)
{
maybe_warn_string_init (TREE_TYPE ($<ttype>5), $6);
finish_decl ($<ttype>5, $6.value, $2);
}
}
| notype_declarator maybeasm maybe_attribute
{ tree d = start_decl ($1, current_declspecs, false,
chainon ($3, all_prefix_attributes));
finish_decl (d, NULL_TREE, $2); }
if (d)
finish_decl (d, NULL_TREE, $2); }
;
/* the * rules are dummies to accept the Apollo extended syntax
so that the header files compile. */

View File

@ -4470,7 +4470,7 @@ start_init (tree decl, tree asmspec_tree ATTRIBUTE_UNUSED, int top_level)
constructor_designated = 0;
constructor_top_level = top_level;
if (decl != 0)
if (decl != 0 && decl != error_mark_node)
{
require_constant_value = TREE_STATIC (decl);
require_constant_elements

View File

@ -1,3 +1,12 @@
2004-12-21 James A. Morrison <phython@gcc.gnu.org>
PR c/18596
* gcc.dg/funcdef-storage-1.c (foo): Remove.
* gcc.dg/pr18596-1.c: Use dg-error.
(dg-options): Use -fno-unit-at-a-time.
* gcc.dg/pr18596-2.c: New test.
* gcc.dg/pr18596-3.c: New test.
2004-12-20 Roger Sayle <roger@eyesopen.com>
PR middle-end/18683

View File

@ -1,5 +1,4 @@
/* { dg-do compile } */
/* { dg-options "" } */
void
flarm(void)
@ -8,8 +7,3 @@ flarm(void)
foo();
}
static void
foo(void)
{
}

View File

@ -1,7 +1,39 @@
/* { dg-do compile } */
/* { dg-options "-fno-unit-at-a-time" } */
int f(int i)
{
static int g(); /* { dg-warning "invalid storage class" } */
static int g() { return i; } /* { dg-warning "invalid storage class" } */
static int g(); /* { dg-error "invalid storage class" } */
static int g() { return i; } /* { dg-error "invalid storage class" } */
return g();
}
int k (int i)
{
static int g (); /* { dg-error "invalid storage class" } */
int g () {
return i;
}
return g ();
}
int l (int i)
{
auto int g ();
static int g () { /* { dg-error "invalid storage class" } */
return i;
}
static int h () { /* { dg-error "invalid storage class" } */
return 3;
}
return g () + h ();
}
int m (int i)
{
static g (); /* { dg-error "invalid storage class" } */
static g () { return i; } /* { dg-error "invalid storage class" } */
return g ();
}

View File

@ -0,0 +1,39 @@
/* { dg-do compile } */
/* { dg-options "-funit-at-a-time" } */
int f(int i)
{
static int g(); /* { dg-error "invalid storage class" } */
static int g() { return i; } /* { dg-error "invalid storage class" } */
return g();
}
int k (int i)
{
static int g (); /* { dg-error "invalid storage class" } */
int g () {
return i;
}
return g ();
}
int l (int i)
{
auto int g ();
static int g () { /* { dg-error "invalid storage class" } */
return i;
}
static int h () { /* { dg-error "invalid storage class" } */
return 3;
}
return g () + h ();
}
int m (int i)
{
static g (); /* { dg-error "invalid storage class" } */
static g () { return i; } /* { dg-error "invalid storage class" } */
return g ();
}

View File

@ -0,0 +1,14 @@
/* { dg-do compile } */
/* { dg-options "" } */
int foo ()
{
static g () = 0; /* { dg-error "invalid storage class" } */
static int f () = 1; /* { dg-error "invalid storage class" } */
auto int h () = 0; /* { dg-error "initialized like a variable" } */
static int i () = { 0 }; /* { dg-error "invalid storage class" } */
static int j () = /* { dg-error "invalid storage class" } */
{ 0, 0.0 };
}
/* { dg-warning "excess elements" "" { target *-*-* } 11 } */
/* { dg-warning "near initialization" "" { target *-*-* } 11 } */