[PR c++/84729] reject parenthesized array init
authorAlexandre Oliva <aoliva@redhat.com>
Fri, 23 Mar 2018 01:19:01 +0000 (01:19 +0000)
committerAlexandre Oliva <aoliva@gcc.gnu.org>
Fri, 23 Mar 2018 01:19:01 +0000 (01:19 +0000)
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

gcc/cp/ChangeLog
gcc/cp/init.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/pr84729.C [new file with mode: 0644]
gcc/testsuite/g++.old-deja/g++.ext/arrnew2.C
gcc/testsuite/g++.old-deja/g++.robertl/eb58.C
gcc/testsuite/g++.old-deja/g++.robertl/eb63.C

index 5dae29d..33add69 100644 (file)
@@ -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
index 3215c23..ff52c42 100644 (file)
@@ -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,
index d4b8c27..07951d9 100644 (file)
@@ -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 (file)
index 0000000..e5d689e
--- /dev/null
@@ -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" }
+}
index c6a967c..aff6b9c 100644 (file)
@@ -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;
index 04ec92a..d702296 100644 (file)
@@ -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" }
 }
index a49fb02..653351b 100644 (file)
@@ -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" }
 }