Commit 3ec16e36 by Alexandre Oliva Committed by Alexandre Oliva

[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
parent 91f9108f
2018-03-22 Alexandre Oliva <aoliva@redhat.com> 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++/84610
PR c++/84642 PR c++/84642
PR c++/84942 PR c++/84942
......
...@@ -3370,11 +3370,8 @@ build_new_1 (vec<tree, va_gc> **placement, tree type, tree nelts, ...@@ -3370,11 +3370,8 @@ build_new_1 (vec<tree, va_gc> **placement, tree type, tree nelts,
else if (*init) else if (*init)
{ {
if (complain & tf_error) if (complain & tf_error)
permerror (input_location, error ("parenthesized initializer in array new");
"parenthesized initializer in array new"); return error_mark_node;
else
return error_mark_node;
vecinit = build_tree_list_vec (*init);
} }
init_expr init_expr
= build_vec_init (data_addr, = build_vec_init (data_addr,
......
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 2018-03-22 Steven G. Kargl <kargl@gcc.gnu.org
PR fortran/84922 PR fortran/84922
......
// { dg-do compile }
// { dg-options "-fpermissive" }
typedef int b[2];
void a() {
new b(a); // { dg-error "parenthesized initializer in array new" }
}
// { dg-do run } // { dg-do compile }
// { dg-options "-w -fpermissive" } // { dg-options "-w -fpermissive" }
int *foo = new int[1](42); // { dg-bogus "" } int *foo = new int[1](42); // { dg-error "parenthesized" }
int main () int main ()
{ {
return foo[0] != 42; return foo[0] != 42;
......
// { dg-do run } // { dg-do compile }
// { dg-options "-w -fpermissive" } // { dg-options "-w -fpermissive" }
// Test for g++ array init extension // Test for g++ array init extension
...@@ -11,5 +11,5 @@ private: ...@@ -11,5 +11,5 @@ private:
main() main()
{ {
A *list = new A[10](4); A *list = new A[10](4); // { dg-error "parenthesized" }
} }
// { dg-do run } // { dg-do compile }
// { dg-options "-w -fpermissive" } // { dg-options "-w -fpermissive" }
//This uses GNU extensions, so disable -ansi //This uses GNU extensions, so disable -ansi
#include <stdio.h> #include <stdio.h>
...@@ -13,5 +13,5 @@ public: ...@@ -13,5 +13,5 @@ public:
main() { main() {
A* a; A* a;
a = new A[2](1,false); a = new A[2](1,false); // { dg-error "parenthesized" }
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment