Commit b1c83c23 by Jason Merrill Committed by Jason Merrill

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
parent 7371639a
2011-12-01 Jason Merrill <jason@redhat.com>
* call.c (build_new_method_call_1): Handle aggregate initialization.
* tree.c (stabilize_init): Handle CONSTRUCTOR.
2011-12-01 Paolo Carlini <paolo.carlini@oracle.com> 2011-12-01 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/51326 PR c++/51326
......
...@@ -7198,6 +7198,7 @@ build_new_method_call_1 (tree instance, tree fns, VEC(tree,gc) **args, ...@@ -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))) && CONSTRUCTOR_IS_DIRECT_INIT (VEC_index (tree, *args, 0)))
{ {
tree init_list = VEC_index (tree, *args, 0); tree init_list = VEC_index (tree, *args, 0);
tree init = NULL_TREE;
gcc_assert (VEC_length (tree, *args) == 1 gcc_assert (VEC_length (tree, *args) == 1
&& !(flags & LOOKUP_ONLYCONVERTING)); && !(flags & LOOKUP_ONLYCONVERTING));
...@@ -7209,8 +7210,16 @@ build_new_method_call_1 (tree instance, tree fns, VEC(tree,gc) **args, ...@@ -7209,8 +7210,16 @@ build_new_method_call_1 (tree instance, tree fns, VEC(tree,gc) **args,
if (CONSTRUCTOR_NELTS (init_list) == 0 if (CONSTRUCTOR_NELTS (init_list) == 0
&& TYPE_HAS_DEFAULT_CONSTRUCTOR (basetype) && TYPE_HAS_DEFAULT_CONSTRUCTOR (basetype)
&& !processing_template_decl) && !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)) if (integer_zerop (instance_ptr))
return get_target_expr_sfinae (init, complain); return get_target_expr_sfinae (init, complain);
ob = build_fold_indirect_ref (instance_ptr); ob = build_fold_indirect_ref (instance_ptr);
...@@ -7219,6 +7228,7 @@ build_new_method_call_1 (tree instance, tree fns, VEC(tree,gc) **args, ...@@ -7219,6 +7228,7 @@ build_new_method_call_1 (tree instance, tree fns, VEC(tree,gc) **args,
return init; return init;
} }
/* Otherwise go ahead with overload resolution. */
add_list_candidates (fns, first_mem_arg, init_list, add_list_candidates (fns, first_mem_arg, init_list,
basetype, explicit_targs, template_only, basetype, explicit_targs, template_only,
conversion_path, access_binfo, flags, &candidates); conversion_path, access_binfo, flags, &candidates);
......
...@@ -3337,6 +3337,7 @@ stabilize_init (tree init, tree *initp) ...@@ -3337,6 +3337,7 @@ stabilize_init (tree init, tree *initp)
if (TREE_CODE (t) == INIT_EXPR if (TREE_CODE (t) == INIT_EXPR
&& TREE_CODE (TREE_OPERAND (t, 1)) != TARGET_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_CODE (TREE_OPERAND (t, 1)) != AGGR_INIT_EXPR)
{ {
TREE_OPERAND (t, 1) = stabilize_expr (TREE_OPERAND (t, 1), initp); TREE_OPERAND (t, 1) = stabilize_expr (TREE_OPERAND (t, 1), initp);
......
2011-12-01 Jason Merrill <jason@redhat.com>
* g++.dg/cpp0x/initlist61.C: New.
2011-12-01 Paolo Carlini <paolo.carlini@oracle.com> 2011-12-01 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/51326 PR c++/51326
......
// { dg-do compile { target c++11 } }
struct N { N(int); };
struct A { N i,j; };
int main()
{
A* ap = new A{1,2};
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment