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