aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorAlexandre Oliva <aoliva@redhat.com>2018-03-23 01:19:01 +0000
committerAlexandre Oliva <aoliva@gcc.gnu.org>2018-03-23 01:19:01 +0000
commit3ec16e36107214035fe9d1177e0acc6ebe037112 (patch)
tree5507925d2db5beeb704eaedf8a5f95a25504d3b0 /gcc
parent91f9108f1bd90c307daadfb4876258ec57cb746b (diff)
downloadgcc-3ec16e36107214035fe9d1177e0acc6ebe037112.zip
gcc-3ec16e36107214035fe9d1177e0acc6ebe037112.tar.gz
gcc-3ec16e36107214035fe9d1177e0acc6ebe037112.tar.bz2
[PR c++/84729] reject parenthesized array init
A parenthesized initializer was 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. Instead of fixing it, converting the initializer to the base type after turning the TREE_LIST initializer to a compound_expr, we disable this deprecated extension. for gcc/cp/ChangeLog PR c++/84729 * init.c (build_vec_init): Error at parenthesized array init. for gcc/testsuite/ChangeLog PR c++/84729 * g++.dg/pr84729.C: New. * g++.old-deja/g++.ext/arrnew2.C: Require error. * g++.old-deja/g++.robertl/eb58.C: Likewise. * g++.old-deja/g++.robertl/eb63.C: Likewise. From-SVN: r258791
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog3
-rw-r--r--gcc/cp/init.c7
-rw-r--r--gcc/testsuite/ChangeLog8
-rw-r--r--gcc/testsuite/g++.dg/pr84729.C7
-rw-r--r--gcc/testsuite/g++.old-deja/g++.ext/arrnew2.C4
-rw-r--r--gcc/testsuite/g++.old-deja/g++.robertl/eb58.C4
-rw-r--r--gcc/testsuite/g++.old-deja/g++.robertl/eb63.C4
7 files changed, 26 insertions, 11 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 5dae29d..33add69 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,8 @@
2018-03-22 Alexandre Oliva <aoliva@redhat.com>
+ PR c++/84729
+ * init.c (build_vec_init): Error at parenthesized array init.
+
PR c++/84610
PR c++/84642
PR c++/84942
diff --git a/gcc/cp/init.c b/gcc/cp/init.c
index 3215c23..ff52c42 100644
--- a/gcc/cp/init.c
+++ b/gcc/cp/init.c
@@ -3370,11 +3370,8 @@ build_new_1 (vec<tree, va_gc> **placement, tree type, tree nelts,
else if (*init)
{
if (complain & tf_error)
- permerror (input_location,
- "parenthesized initializer in array new");
- else
- return error_mark_node;
- vecinit = build_tree_list_vec (*init);
+ error ("parenthesized initializer in array new");
+ return error_mark_node;
}
init_expr
= build_vec_init (data_addr,
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index d4b8c27..07951d9 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,11 @@
+2018-03-22 Alexandre Oliva <aoliva@redhat.com>
+
+ PR c++/84729
+ * g++.dg/pr84729.C: New.
+ * g++.old-deja/g++.ext/arrnew2.C: Require error.
+ * g++.old-deja/g++.robertl/eb58.C: Likewise.
+ * g++.old-deja/g++.robertl/eb63.C: Likewise.
+
2018-03-22 Steven G. Kargl <kargl@gcc.gnu.org
PR fortran/84922
diff --git a/gcc/testsuite/g++.dg/pr84729.C b/gcc/testsuite/g++.dg/pr84729.C
new file mode 100644
index 0000000..e5d689e
--- /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-error "parenthesized initializer in array new" }
+}
diff --git a/gcc/testsuite/g++.old-deja/g++.ext/arrnew2.C b/gcc/testsuite/g++.old-deja/g++.ext/arrnew2.C
index c6a967c..aff6b9c 100644
--- a/gcc/testsuite/g++.old-deja/g++.ext/arrnew2.C
+++ b/gcc/testsuite/g++.old-deja/g++.ext/arrnew2.C
@@ -1,7 +1,7 @@
-// { dg-do run }
+// { dg-do compile }
// { dg-options "-w -fpermissive" }
-int *foo = new int[1](42); // { dg-bogus "" }
+int *foo = new int[1](42); // { dg-error "parenthesized" }
int main ()
{
return foo[0] != 42;
diff --git a/gcc/testsuite/g++.old-deja/g++.robertl/eb58.C b/gcc/testsuite/g++.old-deja/g++.robertl/eb58.C
index 04ec92a..d702296b 100644
--- a/gcc/testsuite/g++.old-deja/g++.robertl/eb58.C
+++ b/gcc/testsuite/g++.old-deja/g++.robertl/eb58.C
@@ -1,4 +1,4 @@
-// { dg-do run }
+// { dg-do compile }
// { dg-options "-w -fpermissive" }
// Test for g++ array init extension
@@ -11,5 +11,5 @@ private:
main()
{
- A *list = new A[10](4);
+ A *list = new A[10](4); // { dg-error "parenthesized" }
}
diff --git a/gcc/testsuite/g++.old-deja/g++.robertl/eb63.C b/gcc/testsuite/g++.old-deja/g++.robertl/eb63.C
index a49fb02..653351b 100644
--- a/gcc/testsuite/g++.old-deja/g++.robertl/eb63.C
+++ b/gcc/testsuite/g++.old-deja/g++.robertl/eb63.C
@@ -1,4 +1,4 @@
-// { dg-do run }
+// { dg-do compile }
// { dg-options "-w -fpermissive" }
//This uses GNU extensions, so disable -ansi
#include <stdio.h>
@@ -13,5 +13,5 @@ public:
main() {
A* a;
- a = new A[2](1,false);
+ a = new A[2](1,false); // { dg-error "parenthesized" }
}