This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] Fix PR c/35445: ICE with conflicting declarations


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 <simartin@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 <simartin@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" } */


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]