From: Jakub Jelinek Date: Fri, 28 Nov 2014 17:06:23 +0000 (+0100) Subject: backport: re PR middle-end/64067 (ICE in expand_expr_real_1, at expr.c:10540, involvi... X-Git-Tag: releases/gcc-4.8.4~93 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=14797baefbf937531e7f1d1de636cee91d8762d9;p=thirdparty%2Fgcc.git backport: re PR middle-end/64067 (ICE in expand_expr_real_1, at expr.c:10540, involving compound literal shenanigans) Backported from mainline 2014-11-27 Jakub Jelinek PR middle-end/64067 * expr.c (expand_expr_addr_expr_1) : Handle it by returning address of COMPOUND_LITERAL_EXPR_DECL not only if modifier is EXPAND_INITIALIZER, but whenever COMPOUND_LITERAL_EXPR_DECL is non-NULL and TREE_STATIC. * gcc.c-torture/compile/pr64067.c: New test. From-SVN: r218169 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 47fefa01be8a..7e04d5e7f224 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,6 +1,14 @@ 2014-11-28 Jakub Jelinek Backported from mainline + 2014-11-27 Jakub Jelinek + + PR middle-end/64067 + * expr.c (expand_expr_addr_expr_1) : + Handle it by returning address of COMPOUND_LITERAL_EXPR_DECL + not only if modifier is EXPAND_INITIALIZER, but whenever + COMPOUND_LITERAL_EXPR_DECL is non-NULL and TREE_STATIC. + 2014-10-31 Jakub Jelinek PR rtl-optimization/63659 diff --git a/gcc/expr.c b/gcc/expr.c index f83a7d0d448e..8a82b7af03f2 100644 --- a/gcc/expr.c +++ b/gcc/expr.c @@ -7590,11 +7590,13 @@ expand_expr_addr_expr_1 (tree exp, rtx target, enum machine_mode tmode, 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)) + /* Allow COMPOUND_LITERAL_EXPR in initializers or coming from + initializers, if e.g. rtl_for_decl_init is called on DECL_INITIAL + with COMPOUND_LITERAL_EXPRs in it, or ARRAY_REF on a const static + array with address of COMPOUND_LITERAL_EXPR in DECL_INITIAL; + the initializers aren't gimplified. */ + if (COMPOUND_LITERAL_EXPR_DECL (exp) + && TREE_STATIC (COMPOUND_LITERAL_EXPR_DECL (exp))) return expand_expr_addr_expr_1 (COMPOUND_LITERAL_EXPR_DECL (exp), target, tmode, modifier, as); /* FALLTHRU */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 38d5c102bce6..714d3f94d763 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,6 +1,11 @@ 2014-11-28 Jakub Jelinek Backported from mainline + 2014-11-27 Jakub Jelinek + + PR middle-end/64067 + * gcc.c-torture/compile/pr64067.c: New test. + 2014-10-31 Jakub Jelinek PR rtl-optimization/63659 diff --git a/gcc/testsuite/gcc.c-torture/compile/pr64067.c b/gcc/testsuite/gcc.c-torture/compile/pr64067.c new file mode 100644 index 000000000000..24ad996efdbb --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr64067.c @@ -0,0 +1,10 @@ +/* PR middle-end/64067 */ + +struct S { int s; }; +int *const v[1] = { &((struct S) { .s = 42 }).s }; + +int * +foo (void) +{ + return v[0]; +}