From 7c094c11510e9a7bb99a9b2b2dd4f6087cedda3c Mon Sep 17 00:00:00 2001
From: Dodji Seketeli <dodji@redhat.com>
Date: Wed, 7 Apr 2010 15:11:42 +0000
Subject: [PATCH] re PR c++/40239 (Aggregate initialization requires copy
 constructor)

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                  |  7 +++++++
 gcc/cp/typeck2.c                  | 10 ++++++++--
 gcc/testsuite/ChangeLog           |  6 ++++++
 gcc/testsuite/g++.dg/init/aggr5.C | 11 +++++++++++
 gcc/testsuite/g++.dg/init/aggr6.C | 11 +++++++++++
 5 files changed, 43 insertions(+), 2 deletions(-)
 create mode 100644 gcc/testsuite/g++.dg/init/aggr5.C
 create mode 100644 gcc/testsuite/g++.dg/init/aggr6.C

diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index fd106914f5ee..6af8a20af12e 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -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
diff --git a/gcc/cp/typeck2.c b/gcc/cp/typeck2.c
index 2610b28eca7e..444ba731b14d 100644
--- a/gcc/cp/typeck2.c
+++ b/gcc/cp/typeck2.c
@@ -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);
 
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index a2faaf5a8183..65c9f0235e89 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 000000000000..228459536f26
--- /dev/null
+++ b/gcc/testsuite/g++.dg/init/aggr5.C
@@ -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
index 000000000000..98628d255abc
--- /dev/null
+++ b/gcc/testsuite/g++.dg/init/aggr6.C
@@ -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 = {};
+}
-- 
GitLab