re PR c++/40239 (Aggregate initialization requires copy constructor)
authorDodji Seketeli <dodji@redhat.com>
Wed, 7 Apr 2010 15:11:42 +0000 (15:11 +0000)
committerDodji Seketeli <dodji@gcc.gnu.org>
Wed, 7 Apr 2010 15:11:42 +0000 (17:11 +0200)
Fix PR c++/40239

gcc/cp/ChangeLog:
PR c++/40239
* typeck2.c (process_init_constructor_record):
value-initialize members that are are not explicitely
initialized.

gcc/testsuite/ChangeLog:
PR c++/40239
* g++.dg/init/aggr5.C: New test.
* g++.dg/init/aggr5.C: New test.

From-SVN: r158066

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

index fd10691..6af8a20 100644 (file)
@@ -1,3 +1,10 @@
+2010-04-07  Dodji Seketeli  <dodji@redhat.com>
+
+       PR c++/40239
+       * typeck2.c (process_init_constructor_record):
+       value-initialize members that are are not explicitely
+       initialized.
+
 2010-04-07  Jie Zhang  <jie@codesourcery.com>
 
        PR c++/42556
index 2610b28..444ba73 100644 (file)
@@ -1166,8 +1166,14 @@ process_init_constructor_record (tree type, tree init)
             for us, so build up TARGET_EXPRs.  If the type in question is
             a class, just build one up; if it's an array, recurse.  */
          if (MAYBE_CLASS_TYPE_P (TREE_TYPE (field)))
-           next = build_functional_cast (TREE_TYPE (field), NULL_TREE,
-                                          tf_warning_or_error);
+           {
+             next = build_functional_cast (TREE_TYPE (field), NULL_TREE,
+                                           tf_warning_or_error);
+             /* direct-initialize the target. No temporary is going
+                 to be involved.  */
+             if (TREE_CODE (next) == TARGET_EXPR)
+               TARGET_EXPR_DIRECT_INIT_P (next) = true;
+           }
          else
            next = build_constructor (init_list_type_node, NULL);
 
index a2faaf5..65c9f02 100644 (file)
@@ -1,3 +1,9 @@
+2010-04-07  Dodji Seketeli  <dodji@redhat.com>
+
+       PR c++/40239
+       * g++.dg/init/aggr5.C: New test.
+       * g++.dg/init/aggr5.C: New test.
+
 2010-04-07  Richard Guenther  <rguenther@suse.de>
 
        PR tree-optimization/43270
diff --git a/gcc/testsuite/g++.dg/init/aggr5.C b/gcc/testsuite/g++.dg/init/aggr5.C
new file mode 100644 (file)
index 0000000..2284595
--- /dev/null
@@ -0,0 +1,11 @@
+// Origin PR c++/40239
+// { dg-do "compile" }
+
+struct B { B() { } private: B(B const&); };
+struct A { int a; B b; };
+
+int
+main()
+{
+  A a = {0};
+}
diff --git a/gcc/testsuite/g++.dg/init/aggr6.C b/gcc/testsuite/g++.dg/init/aggr6.C
new file mode 100644 (file)
index 0000000..98628d2
--- /dev/null
@@ -0,0 +1,11 @@
+// Origin PR c++/40239
+// { dg-do compile }
+
+struct B { B() { } private: B(B const&); };
+struct A { int a; B b; };
+
+int
+main()
+{
+  A a = {};
+}