On Mon, 6 May 2013, Jakub Jelinek wrote: > Hi! > > We ICE on the following testcase, because DECL_INITIAL contains > COMPOUND_LITERAL_EXPR, which expr.c assumes has been gimplified, but > initializers aren't gimplified. Fixed thusly, bootstrapped/regtested on > x86_64-linux and i686-linux, ok for trunk/4.8?
Ok. Thanks, Richard. > 2013-05-06 Jakub Jelinek <ja...@redhat.com> > > PR debug/57184 > * expr.c (expand_expr_addr_expr_1): Handle COMPOUND_LITERAL_EXPR > for modifier == EXPAND_INITIALIZER. > > * gcc.dg/pr57184.c: New test. > > --- gcc/expr.c.jj 2013-05-03 14:55:04.000000000 +0200 > +++ gcc/expr.c 2013-05-06 13:41:03.274302405 +0200 > @@ -7561,6 +7561,15 @@ expand_expr_addr_expr_1 (tree exp, rtx t > inner = TREE_OPERAND (exp, 0); > break; > > + case COMPOUND_LITERAL_EXPR: > + /* Allow COMPOUND_LITERAL_EXPR in initializers, if e.g. > + rtl_for_decl_init is called on DECL_INITIAL with > + COMPOUNT_LITERAL_EXPRs in it, they aren't gimplified. */ > + if (modifier == EXPAND_INITIALIZER > + && COMPOUND_LITERAL_EXPR_DECL (exp)) > + return expand_expr_addr_expr_1 (COMPOUND_LITERAL_EXPR_DECL (exp), > + target, tmode, modifier, as); > + /* FALLTHRU */ > default: > /* If the object is a DECL, then expand it for its rtl. Don't bypass > expand_expr, as that can have various side effects; LABEL_DECLs for > --- gcc/testsuite/gcc.dg/pr57184.c.jj 2013-05-06 13:42:12.514923650 +0200 > +++ gcc/testsuite/gcc.dg/pr57184.c 2013-05-06 13:41:55.000000000 +0200 > @@ -0,0 +1,13 @@ > +/* PR debug/57184 */ > +/* { dg-do compile } */ > +/* { dg-options "-O2 -g" } */ > + > +struct S {}; > +void bar (struct S *const); > +static struct S *const c = &(struct S) {}; > + > +void > +foo (void) > +{ > + bar (c); > +} > > Jakub > > -- Richard Biener <rguent...@suse.de> SUSE / SUSE Labs SUSE LINUX Products GmbH - Nuernberg - AG Nuernberg - HRB 16746 GF: Jeff Hawn, Jennifer Guild, Felix Imend