PR middle-end/64067
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 27 Nov 2014 11:04:16 +0000 (11:04 +0000)
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 27 Nov 2014 11:04:16 +0000 (11:04 +0000)
* 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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@218121 138bc75d-0d04-0410-961f-82ee72b054a4

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

index 0d544fc..aa3aa23 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 c7621b0..3d2ff6e 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 045d4fd..1bdaf1b 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];
+}