summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexandre Oliva <aoliva@redhat.com>2018-03-10 06:30:25 -0300
committerAlexandre Oliva <aoliva@redhat.com>2018-03-10 07:32:37 -0300
commitb725303da4cbcd57eb62d9c8bdc1817d666ede8a (patch)
tree388bacdf6e9506669370cee3a5c57c84a0b89d3c
parent54b21b6b6c25f8fd81efc7b5b1dbd8e1a2dde120 (diff)
downloadgcc-aoliva/testme.tar.gz
[PR c++/84729] convert new init to array elt typeaoliva/testme
A parenthesized initializer is only accepted when new()ing an array in permissive mode. We were not careful, however, to convert the TREE_LIST initializer to the array element type in this extension. This patch fixes it: after turning the TREE_LIST initializer to a compound_expr, we convert it to the base type. for gcc/cp/ChangeLog PR c++/84729 * init.c (build_vec_init): Convert tree list to base type. for gcc/testsuite/ChangeLog PR c++/84729 * g++.dg/pr84729.C: New.
-rw-r--r--gcc/cp/init.c10
-rw-r--r--gcc/testsuite/g++.dg/pr84729.C7
2 files changed, 15 insertions, 2 deletions
diff --git a/gcc/cp/init.c b/gcc/cp/init.c
index 15cee17c780..cb62f4886e6 100644
--- a/gcc/cp/init.c
+++ b/gcc/cp/init.c
@@ -4405,8 +4405,14 @@ build_vec_init (tree base, tree maxindex, tree init,
else
{
if (TREE_CODE (init) == TREE_LIST)
- init = build_x_compound_expr_from_list (init, ELK_INIT,
- complain);
+ {
+ init = build_x_compound_expr_from_list (init, ELK_INIT,
+ complain);
+ init
+ = convert_for_initialization (NULL_TREE, type, init,
+ LOOKUP_IMPLICIT, ICR_INIT,
+ NULL_TREE, 0, complain);
+ }
elt_init = (init == error_mark_node
? error_mark_node
: build2 (INIT_EXPR, type, to, init));
diff --git a/gcc/testsuite/g++.dg/pr84729.C b/gcc/testsuite/g++.dg/pr84729.C
new file mode 100644
index 00000000000..6ca7fb0032f
--- /dev/null
+++ b/gcc/testsuite/g++.dg/pr84729.C
@@ -0,0 +1,7 @@
+// { dg-do compile }
+// { dg-options "-fpermissive" }
+
+typedef int b[2];
+void a() {
+ new b(a); // { dg-warning "parenthesized initializer in array new|invalid conversion" }
+}