Hello,
The following invalid snippet triggers an ICE since 4.0.1:
====
extern int i;
extern int i;
int i[] = { 0 };
====
The problem is that 'finish_decl' ends up calling 'composite_type' with
incompatible types when updating the type of the declaration of 'i'
already encountered.
The attached patch fixes this by only calling 'composite_type' if
'comptypes' returned a non-zero value, as stated in this function's
documentation.
I've successfully bootstrapped and tested it on
x86_64-apple-darwin10.6.0. Is it OK for trunk?
Best regards,
Simon
2011-05-01 Simon Martin <simar...@users.sourceforge.net>
PR c/35445
* c-decl.c (finish_decl): Only create a composite if the types are
compatible.
Index: gcc/c-decl.c
===================================================================
--- gcc/c-decl.c (revision 173206)
+++ gcc/c-decl.c (working copy)
@@ -4246,7 +4246,7 @@
b_ext = b_ext->shadowed;
if (b_ext)
{
- if (b_ext->u.type)
+ if (b_ext->u.type && comptypes (b_ext->u.type, type))
b_ext->u.type = composite_type (b_ext->u.type, type);
else
b_ext->u.type = type;
2011-05-01 Simon Martin <simar...@users.sourceforge.net>
PR c/35445
* gcc.dg/pr35445.c: New test.
/* PR c/35445 */
/* { dg-do "compile" } */
extern int i;
extern int i; /* { dg-message "was here" } */
int i[] = { 0 }; /* { dg-error "conflicting types" } */