diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index fd106914f5e..6af8a20af12 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2010-04-07 Dodji Seketeli + + PR c++/40239 + * typeck2.c (process_init_constructor_record): + value-initialize members that are are not explicitely + initialized. + 2010-04-07 Jie Zhang PR c++/42556 diff --git a/gcc/cp/typeck2.c b/gcc/cp/typeck2.c index 2610b28eca7..444ba731b14 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 a2faaf5a818..65c9f0235e8 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2010-04-07 Dodji Seketeli + + PR c++/40239 + * g++.dg/init/aggr5.C: New test. + * g++.dg/init/aggr5.C: New test. + 2010-04-07 Richard Guenther 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 00000000000..228459536f2 --- /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 00000000000..98628d255ab --- /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 = {}; +}