OSDN Git Service

PR c++/40948
authorjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 4 Aug 2009 02:10:05 +0000 (02:10 +0000)
committerjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 4 Aug 2009 02:10:05 +0000 (02:10 +0000)
* init.c (build_vec_init): Look through a TARGET_EXPR around a
CONSTRUCTOR.

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

gcc/cp/ChangeLog
gcc/cp/init.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/ext/complit12.C [new file with mode: 0644]

index a7d26a5..4856136 100644 (file)
@@ -1,3 +1,10 @@
+2009-08-03  Jason Merrill  <jason@redhat.com>
+           Jakub Jelinek  <jakub@redhat.com>
+
+       PR c++/40948
+       * init.c (build_vec_init): Look through a TARGET_EXPR around a
+       CONSTRUCTOR.
+
 2009-07-31  Jason Merrill  <jason@redhat.com>
            Douglas Gregor  <doug.gregor@gmail.com>
 
index 3da8ab8..4462428 100644 (file)
@@ -2695,6 +2695,12 @@ build_vec_init (tree base, tree maxindex, tree init,
     gcc_assert (!init);
 
   inner_elt_type = strip_array_types (type);
+
+  /* Look through the TARGET_EXPR around a compound literal.  */
+  if (init && TREE_CODE (init) == TARGET_EXPR
+      && TREE_CODE (TARGET_EXPR_INITIAL (init)) == CONSTRUCTOR)
+    init = TARGET_EXPR_INITIAL (init);
+
   if (init
       && TREE_CODE (atype) == ARRAY_TYPE
       && (from_array == 2
index 86a991e..26a37b1 100644 (file)
@@ -1,3 +1,9 @@
+2009-08-03  Jason Merrill  <jason@redhat.com>
+           Jakub Jelinek  <jakub@redhat.com>
+
+       PR c++/40948
+       * g++.dg/ext/complit12.C: New.
+
 2009-08-03  Janis Johnson  <janis187@us.ibm.com>
 
        PR c/39902
diff --git a/gcc/testsuite/g++.dg/ext/complit12.C b/gcc/testsuite/g++.dg/ext/complit12.C
new file mode 100644 (file)
index 0000000..8105621
--- /dev/null
@@ -0,0 +1,54 @@
+// PR c++/40948
+// { dg-do run }
+// { dg-options "" }
+
+int c;
+struct M
+{
+  M () { ++c; }
+  M (const M&) { ++c; }
+  ~M () { --c; }
+};
+
+struct S
+{
+  S ();
+  M m[1];
+};
+
+S::S () : m ((M[1]) { M () })
+{
+}
+
+struct T
+{
+  T ();
+  M m[4];
+};
+
+T::T () : m ((M[4]) { M (), M (), M (), M () })
+{
+}
+
+int main ()
+{
+  {
+    M m[1] = (M[1]) { M () };
+    if (c != 1)
+      return 1;
+    M n = (M) { M () };
+    if (c != 2)
+      return 2;
+    M o[4] = (M[4]) { M (), M (), M (), M () };
+    if (c != 6)
+      return 3;
+    S s;
+    if (c != 7)
+      return 4;
+    T t;
+    if (c != 11)
+      return 5;
+  }
+  if (c != 0)
+    return 6;
+}