From c20f7e9971d35b89f17ee6a1bc8ab2462288adda Mon Sep 17 00:00:00 2001 From: Marek Polacek Date: Wed, 11 Dec 2019 18:40:55 +0000 Subject: PR c++/92878 - Parenthesized init of aggregates in new-expression. Ville pointed out that our paren init of aggregates doesn't work for auto a = new A(1, 2, 3); and I think it should: A new-expression that creates an object of type T initializes that object as follows: ... -- Otherwise, the new-initializer is interpreted according to the initialization rules of [dcl.init] for direct-initialization. so I think it follows that we should perform dcl.init#17.6.2.2. This doesn't work with new[]; we have: error ("parenthesized initializer in array new"); * init.c (build_new_1): Handle parenthesized initialization of aggregates in new-expression. * g++.dg/cpp2a/paren-init20.C: New test. From-SVN: r279240 --- gcc/cp/init.c | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) (limited to 'gcc/cp/init.c') diff --git a/gcc/cp/init.c b/gcc/cp/init.c index ecd0951..6f4c918 100644 --- a/gcc/cp/init.c +++ b/gcc/cp/init.c @@ -3608,10 +3608,22 @@ build_new_1 (vec **placement, tree type, tree nelts, tree ie; /* We are processing something like `new int (10)', which - means allocate an int, and initialize it with 10. */ + means allocate an int, and initialize it with 10. - ie = build_x_compound_expr_from_vec (*init, "new initializer", - complain); + In C++20, also handle `new A(1, 2)'. */ + if (cxx_dialect >= cxx2a + && AGGREGATE_TYPE_P (type) + && (*init)->length () > 1) + { + ie = build_tree_list_vec (*init); + ie = build_constructor_from_list (init_list_type_node, ie); + CONSTRUCTOR_IS_DIRECT_INIT (ie) = true; + CONSTRUCTOR_IS_PAREN_INIT (ie) = true; + ie = digest_init (type, ie, complain); + } + else + ie = build_x_compound_expr_from_vec (*init, "new initializer", + complain); init_expr = cp_build_modify_expr (input_location, init_expr, INIT_EXPR, ie, complain); } -- cgit v1.1