diff options
author | Alexandre Oliva <aoliva@redhat.com> | 2018-03-23 01:19:01 +0000 |
---|---|---|
committer | Alexandre Oliva <aoliva@gcc.gnu.org> | 2018-03-23 01:19:01 +0000 |
commit | 3ec16e36107214035fe9d1177e0acc6ebe037112 (patch) | |
tree | 5507925d2db5beeb704eaedf8a5f95a25504d3b0 /gcc | |
parent | 91f9108f1bd90c307daadfb4876258ec57cb746b (diff) | |
download | gcc-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/ChangeLog | 3 | ||||
-rw-r--r-- | gcc/cp/init.c | 7 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/pr84729.C | 7 | ||||
-rw-r--r-- | gcc/testsuite/g++.old-deja/g++.ext/arrnew2.C | 4 | ||||
-rw-r--r-- | gcc/testsuite/g++.old-deja/g++.robertl/eb58.C | 4 | ||||
-rw-r--r-- | gcc/testsuite/g++.old-deja/g++.robertl/eb63.C | 4 |
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" } } |