From b1c83c23806e200f28a5467e682344bf828dfc9e Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Thu, 1 Dec 2011 21:57:40 -0500 Subject: [PATCH] call.c (build_new_method_call_1): Handle aggregate initialization. * call.c (build_new_method_call_1): Handle aggregate initialization. * tree.c (stabilize_init): Handle CONSTRUCTOR. From-SVN: r181902 --- gcc/cp/ChangeLog | 5 +++++ gcc/cp/call.c | 12 +++++++++++- gcc/cp/tree.c | 1 + gcc/testsuite/ChangeLog | 4 ++++ gcc/testsuite/g++.dg/cpp0x/initlist61.C | 9 +++++++++ 5 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/cpp0x/initlist61.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 0c118f16aa17..201f5efb6039 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2011-12-01 Jason Merrill + + * call.c (build_new_method_call_1): Handle aggregate initialization. + * tree.c (stabilize_init): Handle CONSTRUCTOR. + 2011-12-01 Paolo Carlini PR c++/51326 diff --git a/gcc/cp/call.c b/gcc/cp/call.c index e7bbf0a1d8bf..548a36bf8e50 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -7198,6 +7198,7 @@ build_new_method_call_1 (tree instance, tree fns, VEC(tree,gc) **args, && CONSTRUCTOR_IS_DIRECT_INIT (VEC_index (tree, *args, 0))) { tree init_list = VEC_index (tree, *args, 0); + tree init = NULL_TREE; gcc_assert (VEC_length (tree, *args) == 1 && !(flags & LOOKUP_ONLYCONVERTING)); @@ -7209,8 +7210,16 @@ build_new_method_call_1 (tree instance, tree fns, VEC(tree,gc) **args, if (CONSTRUCTOR_NELTS (init_list) == 0 && TYPE_HAS_DEFAULT_CONSTRUCTOR (basetype) && !processing_template_decl) + init = build_value_init (basetype, complain); + + /* If BASETYPE is an aggregate, we need to do aggregate + initialization. */ + else if (CP_AGGREGATE_TYPE_P (basetype)) + init = digest_init (basetype, init_list, complain); + + if (init) { - tree ob, init = build_value_init (basetype, complain); + tree ob; if (integer_zerop (instance_ptr)) return get_target_expr_sfinae (init, complain); ob = build_fold_indirect_ref (instance_ptr); @@ -7219,6 +7228,7 @@ build_new_method_call_1 (tree instance, tree fns, VEC(tree,gc) **args, return init; } + /* Otherwise go ahead with overload resolution. */ add_list_candidates (fns, first_mem_arg, init_list, basetype, explicit_targs, template_only, conversion_path, access_binfo, flags, &candidates); diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c index d206fd2ec248..8d179d8d2a08 100644 --- a/gcc/cp/tree.c +++ b/gcc/cp/tree.c @@ -3337,6 +3337,7 @@ stabilize_init (tree init, tree *initp) if (TREE_CODE (t) == INIT_EXPR && TREE_CODE (TREE_OPERAND (t, 1)) != TARGET_EXPR + && TREE_CODE (TREE_OPERAND (t, 1)) != CONSTRUCTOR && TREE_CODE (TREE_OPERAND (t, 1)) != AGGR_INIT_EXPR) { TREE_OPERAND (t, 1) = stabilize_expr (TREE_OPERAND (t, 1), initp); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 084ef4433200..cd9e27e77f80 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2011-12-01 Jason Merrill + + * g++.dg/cpp0x/initlist61.C: New. + 2011-12-01 Paolo Carlini PR c++/51326 diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist61.C b/gcc/testsuite/g++.dg/cpp0x/initlist61.C new file mode 100644 index 000000000000..28eccc2637db --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/initlist61.C @@ -0,0 +1,9 @@ +// { dg-do compile { target c++11 } } + +struct N { N(int); }; +struct A { N i,j; }; + +int main() +{ + A* ap = new A{1,2}; +}