re PR middle-end/64067 (ICE in expand_expr_real_1, at expr.c:10540, involving compoun...
authorJakub Jelinek <jakub@redhat.com>
Thu, 27 Nov 2014 11:04:16 +0000 (12:04 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Thu, 27 Nov 2014 11:04:16 +0000 (12:04 +0100)
PR middle-end/64067
* expr.c (expand_expr_addr_expr_1) <case COMPOUND_LITERAL_EXPR>:
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: r218121

gcc/ChangeLog
gcc/expr.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/compile/pr64067.c [new file with mode: 0644]

index 0d544fcb6d962c807eb0b42de59475bc0376a466..aa3aa237957838282247189657235235be736d96 100644 (file)
@@ -1,5 +1,11 @@
 2014-11-27  Jakub Jelinek  <jakub@redhat.com>
 
+       PR middle-end/64067
+       * expr.c (expand_expr_addr_expr_1) <case COMPOUND_LITERAL_EXPR>:
+       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.
+
        PR tree-optimization/64024
        * tree-vectorizer.h (struct _stmt_vec_info): Remove simd_clone_fndecl
        field.  Add simd_clone_info field.
index c7621b0e9c851dca270b8b055a5219006dd47aae..3d2ff6ec03ada5b54c66c3a6177a963c807be253 100644 (file)
@@ -7677,11 +7677,13 @@ expand_expr_addr_expr_1 (tree exp, rtx target, 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 */
index 045d4fde9a6b6512927ea830ff0447c859d90cfa..1bdaf1b9ef8b6315154844b73b58be9ea3c158f4 100644 (file)
@@ -1,5 +1,8 @@
 2014-11-27  Jakub Jelinek  <jakub@redhat.com>
 
+       PR middle-end/64067
+       * gcc.c-torture/compile/pr64067.c: New test.
+
        PR tree-optimization/64024
        * gcc.dg/vect/vect-simd-clone-13.c: New test.
        * gcc.dg/vect/vect-simd-clone-14.c: New test.
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr64067.c b/gcc/testsuite/gcc.c-torture/compile/pr64067.c
new file mode 100644 (file)
index 0000000..24ad996
--- /dev/null
@@ -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];
+}