aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2011-12-01 21:57:40 -0500
committerJason Merrill <jason@gcc.gnu.org>2011-12-01 21:57:40 -0500
commitb1c83c23806e200f28a5467e682344bf828dfc9e (patch)
tree533f69a58016333ea6144ae9d283af25fffe6db0
parent7371639a96499bb08992db65cefea1712c47c39f (diff)
downloadgcc-b1c83c23806e200f28a5467e682344bf828dfc9e.zip
gcc-b1c83c23806e200f28a5467e682344bf828dfc9e.tar.gz
gcc-b1c83c23806e200f28a5467e682344bf828dfc9e.tar.bz2
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
-rw-r--r--gcc/cp/ChangeLog5
-rw-r--r--gcc/cp/call.c12
-rw-r--r--gcc/cp/tree.c1
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/initlist61.C9
5 files changed, 30 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 0c118f1..201f5ef 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -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
diff --git a/gcc/cp/call.c b/gcc/cp/call.c
index e7bbf0a..548a36b 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 d206fd2..8d179d8 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 084ef44..cd9e27e 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist61.C b/gcc/testsuite/g++.dg/cpp0x/initlist61.C
new file mode 100644
index 0000000..28eccc2
--- /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};
+}