mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-03-19 06:40:31 +08:00
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
This commit is contained in:
parent
7371639a96
commit
b1c83c2380
@ -1,3 +1,8 @@
|
||||
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>
|
||||
|
||||
PR c++/51326
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -1,3 +1,7 @@
|
||||
2011-12-01 Jason Merrill <jason@redhat.com>
|
||||
|
||||
* g++.dg/cpp0x/initlist61.C: New.
|
||||
|
||||
2011-12-01 Paolo Carlini <paolo.carlini@oracle.com>
|
||||
|
||||
PR c++/51326
|
||||
|
9
gcc/testsuite/g++.dg/cpp0x/initlist61.C
Normal file
9
gcc/testsuite/g++.dg/cpp0x/initlist61.C
Normal file
@ -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};
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user