Remove N3639 "array of runtime length" from -std=c++14.
authorJason Merrill <jason@redhat.com>
Fri, 12 Dec 2014 03:49:13 +0000 (22:49 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Fri, 12 Dec 2014 03:49:13 +0000 (22:49 -0500)
gcc/cp/
* decl.c (compute_array_index_type): VLAs are not part of C++14.
(create_array_type_for_decl, grokdeclarator): Likewise.
* lambda.c (add_capture): Likewise.
* pt.c (tsubst): Likewise.
* rtti.c (get_tinfo_decl): Likewise.
* semantics.c (finish_decltype_type): Likewise.
* typeck.c (cxx_sizeof_or_alignof_type): Likewise.
(cp_build_addr_expr_1): Likewise.
* init.c (build_vec_init): Don't throw bad_array_length.
gcc/c-family/
* c-cppbuiltin.c (c_cpp_builtins): Define __cpp_runtime_arrays if
we aren't complaining about VLAs.
libstdc++-v3/
* libsupc++/new (bad_array_length): Move...
* bad_array_length.cc: ...here.
* cxxabi.h, eh_aux_runtime.cc (__cxa_throw_bad_array_new_length): Also
move to bad_array_length.cc.

* c-cppbuiltin.c (c_cpp_builtins): Define __cpp_runtime_arrays if
we aren't complaining about VLAs.

From-SVN: r218655

38 files changed:
gcc/c-family/ChangeLog
gcc/c-family/c-cppbuiltin.c
gcc/cp/ChangeLog
gcc/cp/decl.c
gcc/cp/init.c
gcc/cp/lambda.c
gcc/cp/pt.c
gcc/cp/rtti.c
gcc/cp/semantics.c
gcc/cp/tree.c
gcc/cp/typeck.c
gcc/testsuite/g++.dg/cpp0x/Wattributes1.C
gcc/testsuite/g++.dg/cpp0x/initlist26.C
gcc/testsuite/g++.dg/cpp1y/feat-cxx11-neg.C
gcc/testsuite/g++.dg/cpp1y/feat-cxx11.C
gcc/testsuite/g++.dg/cpp1y/feat-cxx14.C
gcc/testsuite/g++.dg/cpp1y/feat-cxx98-neg.C
gcc/testsuite/g++.dg/cpp1y/feat-cxx98.C
gcc/testsuite/g++.dg/cpp1y/feat-vla.C [new file with mode: 0644]
gcc/testsuite/g++.dg/cpp1y/lambda-generic-vla1.C
gcc/testsuite/g++.dg/cpp1y/vla-initlist1.C
gcc/testsuite/g++.dg/cpp1y/vla1.C [deleted file]
gcc/testsuite/g++.dg/cpp1y/vla10.C
gcc/testsuite/g++.dg/cpp1y/vla11.C [deleted file]
gcc/testsuite/g++.dg/cpp1y/vla12.C [deleted file]
gcc/testsuite/g++.dg/cpp1y/vla13.C [deleted file]
gcc/testsuite/g++.dg/cpp1y/vla2.C
gcc/testsuite/g++.dg/cpp1y/vla3.C [deleted file]
gcc/testsuite/g++.dg/cpp1y/vla4.C
gcc/testsuite/g++.dg/cpp1y/vla5.C
gcc/testsuite/g++.dg/cpp1y/vla8.C
gcc/testsuite/g++.dg/cpp1y/vla9.C
gcc/testsuite/g++.dg/ext/vla11.C
libstdc++-v3/ChangeLog
libstdc++-v3/libsupc++/bad_array_length.cc
libstdc++-v3/libsupc++/cxxabi.h
libstdc++-v3/libsupc++/eh_aux_runtime.cc
libstdc++-v3/libsupc++/new

index 9cc46d4053dc620861d66cad9f6a21ff0316f3d2..db08d185e08c0bd1e0cd67e0f16f3a294184050e 100644 (file)
@@ -1,3 +1,8 @@
+2014-12-11  Jason Merrill  <jason@redhat.com>
+
+       * c-cppbuiltin.c (c_cpp_builtins): Define __cpp_runtime_arrays if
+       we aren't complaining about VLAs.
+
 2014-12-06  Marek Polacek  <polacek@redhat.com>
 
        PR tree-optimization/64183
index c571d1b2e1ea569f456d24faf416490824c1af40..54d3acd85479dc768b5027d0780c1578e979c6e1 100644 (file)
@@ -828,6 +828,15 @@ c_cpp_builtins (cpp_reader *pfile)
         and were standardized for C++14.  */
       if (!pedantic || cxx_dialect > cxx11)
        cpp_define (pfile, "__cpp_binary_literals=201304");
+
+      /* Arrays of runtime bound were removed from C++14, but we still
+        support GNU VLAs.  Let's define this macro to a low number
+        (corresponding to the initial test release of GNU C++) if we won't
+        complain about use of VLAs.  */
+      if (c_dialect_cxx ()
+         && (pedantic ? warn_vla == 0 : warn_vla <= 0))
+       cpp_define (pfile, "__cpp_runtime_arrays=198712");
+
       if (cxx_dialect >= cxx11)
        {
          /* Set feature test macros for C++11  */
@@ -863,9 +872,6 @@ c_cpp_builtins (cpp_reader *pfile)
          cpp_define (pfile, "__cpp_variable_templates=201304");
          cpp_define (pfile, "__cpp_digit_separators=201309");
          //cpp_define (pfile, "__cpp_sized_deallocation=201309");
-         /* We'll have to see where runtime arrays wind up.
-            Let's put it in C++14 for now.  */
-         cpp_define (pfile, "__cpp_runtime_arrays=201304");
        }
     }
   /* Note that we define this for C as well, so that we know if
index 52b582d34cd7397b7e5ada2004969b605d27fb68..53bf2f5981c2bcb2fd62b1631bc0299c1a35c7f2 100644 (file)
@@ -1,5 +1,16 @@
 2014-12-11  Jason Merrill  <jason@redhat.com>
 
+       Remove N3639 "array of runtime length" from -std=c++14.
+       * decl.c (compute_array_index_type): VLAs are not part of C++14.
+       (create_array_type_for_decl, grokdeclarator): Likewise.
+       * lambda.c (add_capture): Likewise.
+       * pt.c (tsubst): Likewise.
+       * rtti.c (get_tinfo_decl): Likewise.
+       * semantics.c (finish_decltype_type): Likewise.
+       * typeck.c (cxx_sizeof_or_alignof_type): Likewise.
+       (cp_build_addr_expr_1): Likewise.
+       * init.c (build_vec_init): Don't throw bad_array_length.
+
        PR c++/64248
        Revert:
        * parser.c (cp_parser_unqualified_id): Handle __func__ here.
index 9659336f01d122e734aab67abd09a20afa563de1..efc20012831a3fb28b810c0e18b703ef8eae9281 100644 (file)
@@ -8515,7 +8515,7 @@ compute_array_index_type (tree name, tree size, tsubst_flags_t complain)
           /* We don't allow VLAs at non-function scopes, or during
              tentative template substitution.  */
           || !at_function_scope_p ()
-          || (cxx_dialect < cxx14 && !(complain & tf_error)))
+          || !(complain & tf_error))
     {
       if (!(complain & tf_error))
        return error_mark_node;
@@ -8527,7 +8527,7 @@ compute_array_index_type (tree name, tree size, tsubst_flags_t complain)
        error ("size of array is not an integral constant-expression");
       size = integer_one_node;
     }
-  else if (cxx_dialect < cxx14 && pedantic && warn_vla != 0)
+  else if (pedantic && warn_vla != 0)
     {
       if (name)
        pedwarn (input_location, OPT_Wvla, "ISO C++ forbids variable length array %qD", name);
@@ -8585,25 +8585,12 @@ compute_array_index_type (tree name, tree size, tsubst_flags_t complain)
 
          stabilize_vla_size (itype);
 
-         if (cxx_dialect >= cxx14 && flag_exceptions)
+         if (flag_sanitize & SANITIZE_VLA
+             && current_function_decl != NULL_TREE
+             && !lookup_attribute ("no_sanitize_undefined",
+                                   DECL_ATTRIBUTES
+                                   (current_function_decl)))
            {
-             /* If the VLA bound is larger than half the address space,
-                or less than zero, throw std::bad_array_length.  */
-             tree comp = build2 (LT_EXPR, boolean_type_node, itype,
-                                 ssize_int (-1));
-             comp = build3 (COND_EXPR, void_type_node, comp,
-                            throw_bad_array_length (), void_node);
-             finish_expr_stmt (comp);
-           }
-         else if (flag_sanitize & SANITIZE_VLA
-                  && current_function_decl != NULL_TREE
-                  && !lookup_attribute ("no_sanitize_undefined",
-                                        DECL_ATTRIBUTES
-                                          (current_function_decl)))
-           {
-             /* From C++14 onwards, we throw an exception on a negative
-                length size of an array; see above.  */
-
              /* We have to add 1 -- in the ubsan routine we generate
                 LE_EXPR rather than LT_EXPR.  */
              tree t = fold_build2 (PLUS_EXPR, TREE_TYPE (itype), itype,
@@ -8730,10 +8717,6 @@ create_array_type_for_decl (tree name, tree type, tree size)
       return error_mark_node;
     }
 
-  if (cxx_dialect >= cxx14 && array_of_runtime_bound_p (type)
-      && (flag_iso || warn_vla > 0))
-    pedwarn (input_location, OPT_Wvla, "array of array of runtime bound");
-
   /* Figure out the index type for the array.  */
   if (size)
     itype = compute_array_index_type (name, size, tf_warning_or_error);
@@ -9984,13 +9967,6 @@ grokdeclarator (const cp_declarator *declarator,
                    : G_("cannot declare pointer to qualified function type %qT"),
                   type);
 
-         if (cxx_dialect >= cxx14 && array_of_runtime_bound_p (type)
-             && (flag_iso || warn_vla > 0))
-           pedwarn (input_location, OPT_Wvla,
-                    declarator->kind == cdk_reference
-                    ? G_("reference to array of runtime bound")
-                    : G_("pointer to array of runtime bound"));
-
          /* When the pointed-to type involves components of variable size,
             care must be taken to ensure that the size evaluation code is
             emitted early enough to dominate all the possible later uses
@@ -10341,11 +10317,6 @@ grokdeclarator (const cp_declarator *declarator,
          type = error_mark_node;
        }
 
-      if (cxx_dialect >= cxx14 && array_of_runtime_bound_p (type)
-         && (flag_iso || warn_vla > 0))
-       pedwarn (input_location, OPT_Wvla,
-                "typedef naming array of runtime bound");
-
       if (decl_context == FIELD)
        decl = build_lang_decl (TYPE_DECL, unqualified_id, type);
       else
index 19e2cdd528562ba0963e7cafaafcef1ef29d7757..b987ef15a0d0e044a454e89711ea2e92d9a48c1a 100644 (file)
@@ -3591,10 +3591,7 @@ build_vec_init (tree base, tree maxindex, tree init,
       if (length_check)
        {
          tree throw_call;
-         if (array_of_runtime_bound_p (atype))
-           throw_call = throw_bad_array_length ();
-         else
-           throw_call = throw_bad_array_new_length ();
+         throw_call = throw_bad_array_new_length ();
          length_check = build3 (COND_EXPR, void_type_node, length_check,
                                 throw_call, void_node);
          finish_expr_stmt (length_check);
index 01a508aad565e75ea06d0a489f2d898c9e3bee59..9eb9200632326bc5f3c13ef8184402ea681175bd 100644 (file)
@@ -485,7 +485,7 @@ add_capture (tree lambda, tree id, tree orig_init, bool by_reference_p,
     }
   else if (variably_modified_type_p (type, NULL_TREE))
     {
-      error ("capture of variable-size type %qT that is not a C++14 array "
+      error ("capture of variable-size type %qT that is not an N3639 array "
             "of runtime bound", type);
       if (TREE_CODE (type) == ARRAY_TYPE
          && variably_modified_type_p (TREE_TYPE (type), NULL_TREE))
index 8e71fcb7cfca8a38ee96125d2c172286a4a872c1..d8a9c5b1b32b32b9c9276aa33cbe68546b02c1e0 100644 (file)
@@ -12241,21 +12241,6 @@ tsubst (tree t, tree args, tsubst_flags_t complain, tree in_decl)
          r = cp_build_reference_type (type, TYPE_REF_IS_RVALUE (t));
        r = cp_build_qualified_type_real (r, cp_type_quals (t), complain);
 
-       if (cxx_dialect >= cxx14
-           && !(TREE_CODE (t) == REFERENCE_TYPE && REFERENCE_VLA_OK (t))
-           && array_of_runtime_bound_p (type)
-           && (flag_iso || warn_vla > 0))
-         {
-           if (complain & tf_warning_or_error)
-             pedwarn
-               (input_location, OPT_Wvla,
-                code == REFERENCE_TYPE
-                ? G_("cannot declare reference to array of runtime bound")
-                : G_("cannot declare pointer to array of runtime bound"));
-           else
-             r = error_mark_node;
-         }
-
        if (r != error_mark_node)
          /* Will this ever be needed for TYPE_..._TO values?  */
          layout_type (r);
index aef71f27bc5a65bd9f68662fcea80bce4466359e..2270f3d27052d2bbd9d7a18123bc1c1e872bb27d 100644 (file)
@@ -396,12 +396,9 @@ get_tinfo_decl (tree type)
 
   if (variably_modified_type_p (type, /*fn=*/NULL_TREE))
     {
-      if (array_of_runtime_bound_p (type))
-       error ("typeid of array of runtime bound");
-      else
-       error ("cannot create type information for type %qT because "
-              "it involves types of variable size",
-              type);
+      error ("cannot create type information for type %qT because "
+            "it involves types of variable size",
+            type);
       return error_mark_node;
     }
 
index 639702a6e624df7584fd133785a05a7ee8518536..8a1de7e095c97fc92063cfaf9e5d4f8ae79d64b9 100644 (file)
@@ -7239,16 +7239,6 @@ finish_decltype_type (tree expr, bool id_expression_or_member_access_p,
        }
     }
 
-  if (cxx_dialect >= cxx14 && array_of_runtime_bound_p (type)
-      && (flag_iso || warn_vla > 0))
-    {
-      if (complain & tf_warning_or_error)
-       pedwarn (input_location, OPT_Wvla,
-                "taking decltype of array of runtime bound");
-      else
-       return error_mark_node;
-    }
-
   return type;
 }
 
index f8506f512bcf538ce62342129c61613a28d67ab8..6d6abe9020a31a9a4326f16f35c92a3b18f55377 100644 (file)
@@ -920,7 +920,8 @@ build_array_of_n_type (tree elt, int n)
   return build_cplus_array_type (elt, build_index_type (size_int (n - 1)));
 }
 
-/* True iff T is a C++14 array of runtime bound (VLA).  */
+/* True iff T is an N3639 array of runtime bound (VLA).  These were
+   approved for C++14 but then removed.  */
 
 bool
 array_of_runtime_bound_p (tree t)
index dd60d9891053bc1bf9afb4685970fdcd577c9f7b..7b39816bdb1f6962fb6ed17cfb4c17cb60d34d57 100644 (file)
@@ -1578,16 +1578,6 @@ cxx_sizeof_or_alignof_type (tree type, enum tree_code op, bool complain)
       return value;
     }
 
-  if (cxx_dialect >= cxx14 && array_of_runtime_bound_p (type)
-      && (flag_iso || warn_vla > 0))
-    {
-      if (complain)
-       pedwarn (input_location, OPT_Wvla,
-                "taking sizeof array of runtime bound");
-      else
-       return error_mark_node;
-    }
-
   return c_sizeof_or_alignof_type (input_location, complete_type (type),
                                   op == SIZEOF_EXPR, false,
                                   complain);
@@ -5540,18 +5530,7 @@ cp_build_addr_expr_1 (tree arg, bool strict_lvalue, tsubst_flags_t complain)
     }
 
   if (argtype != error_mark_node)
-    {
-      if (cxx_dialect >= cxx14 && array_of_runtime_bound_p (argtype)
-         && (flag_iso || warn_vla > 0))
-       {
-         if (complain & tf_warning_or_error)
-           pedwarn (input_location, OPT_Wvla,
-                    "taking address of array of runtime bound");
-         else
-           return error_mark_node;
-       }
-      argtype = build_pointer_type (argtype);
-    }
+    argtype = build_pointer_type (argtype);
 
   /* In a template, we are processing a non-dependent expression
      so we can just form an ADDR_EXPR with the correct type.  */
index 4d3c29ce3f150ae74d6ae07c6cca493c9dbee2d4..d81885152c57a278cc359fa3c442b3b6c76a99c5 100644 (file)
@@ -5,4 +5,4 @@
 #include <new>
 __attribute__((visibility("hidden")))void*operator new(std::size_t); // { dg-warning "visibility attribute ignored" }
 
-// { dg-message "previous declaration" "" { target *-*-* } 128 }
+// { dg-message "previous declaration" "" { target *-*-* } 111 }
index 260ddd48f5e6dfe2113ee680834b7f8abc45b5d9..8fd267f4409f5a25aa90594c2e36e8d113bb4b15 100644 (file)
@@ -1,6 +1,6 @@
 // PR c++/42059
 // { dg-do compile { target c++11 } }
-// { dg-options "" { target { ! c++14 } } }
+// { dg-options "" }
 
 void
 foo (int i)
index a5b41f4d67d7d67172d6fcf01b931e6775b79054..ec931891173ec47910d64e5699fd9b7e1c538bfc 100644 (file)
@@ -1,5 +1,4 @@
 // { dg-do compile { target c++11_only } }
-// { dg-options "-pedantic-errors" }
 
 // C++14 features:
 
index 3d02e237a460570e861a5908f546ace7cc59987a..67f75a725482aa386c13c7c0013569d9ef5edf3c 100644 (file)
 #  error "__cpp_binary_literals != 201304"
 #endif
 
+//  GNU VLA support:
+
+#ifndef __cpp_runtime_arrays
+#  error "__cpp_runtime_arrays"
+#elif __cpp_runtime_arrays != 198712
+#  error "__cpp_runtime_arrays != 198712"
+#endif
+
 //  C++11 attributes:
 
 #ifdef __has_cpp_attribute
index 74748cbf9f4a176243d68bba0499bfd76d899c83..d271752ec10c06ae43e39be99bb0697aa0a33097 100644 (file)
 #  error "__cpp_sized_deallocation"
 #endif
 
-//  Array TS features:
+//  GNU VLA support:
 
 #ifndef __cpp_runtime_arrays
 #  error "__cpp_runtime_arrays"
-#elif __cpp_runtime_arrays != 201304
-#  error "__cpp_runtime_arrays != 201304"
+#elif __cpp_runtime_arrays != 198712
+#  error "__cpp_runtime_arrays != 198712"
 #endif
 
 //  C++11 attributes:
index e25cac3b130f719985bf19806fddd69b215a2a82..54f42e1841a4cd9771eba991068c27e6dd7bbc19 100644 (file)
@@ -1,5 +1,4 @@
 // { dg-do compile { target c++98_only } }
-// { dg-options "-ansi" }
 
 //  C++11 features:
 
index dce7029f258ffb0692af48a2017e72acb9d71b40..d15e7aadcee1118e4bc0dac471f07803b2a7003f 100644 (file)
 #elif  __cpp_binary_literals != 201304
 #  error "__cpp_binary_literals != 201304"
 #endif
+
+//  GNU VLA support:
+
+#ifndef __cpp_runtime_arrays
+#  error "__cpp_runtime_arrays"
+#elif __cpp_runtime_arrays != 198712
+#  error "__cpp_runtime_arrays != 198712"
+#endif
diff --git a/gcc/testsuite/g++.dg/cpp1y/feat-vla.C b/gcc/testsuite/g++.dg/cpp1y/feat-vla.C
new file mode 100644 (file)
index 0000000..e313dd8
--- /dev/null
@@ -0,0 +1,5 @@
+// We shouldn't define this feature macro when we complain about VLAs.
+
+#ifdef __cpp_runtime_arrays
+#  error "__cpp_runtime_arrays"
+#endif
index 90407da97c537db2fe3c0e020edbd1a47db04ebe..4cabccb27b7421d9cfc81da48d36faefe704de71 100644 (file)
@@ -1,5 +1,6 @@
 // PR c++/59271
 // { dg-do compile { target c++14 } }
+// { dg-options "-Wno-vla" }
 
 extern "C" int printf (const char *, ...);
 
index 7b7aa9265325f340f07e8c88f6719f533a5f6f31..8f5709dbc38500e4ce6dbf02b4fc8115153a8f43 100644 (file)
@@ -1,4 +1,5 @@
-// { dg-do run { target c++14 } }
+// { dg-do run { target c++11 } }
+// { dg-options "-Wno-vla" }
 
 #include <initializer_list>
 
diff --git a/gcc/testsuite/g++.dg/cpp1y/vla1.C b/gcc/testsuite/g++.dg/cpp1y/vla1.C
deleted file mode 100644 (file)
index cea17ef..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
-// { dg-do compile { target c++14 } }
-
-#include <typeinfo>
-
-void f(int n)
-{
-  int a[n];
-  int aa[n][n];                        // { dg-error "" }
-  &a;                          // { dg-error "" }
-  sizeof a;                    // { dg-error "" }
-  typeid(a);                   // { dg-error "" }
-  decltype(a) a2;              // { dg-error "" }
-  typedef int at[n];           // { dg-error "" }
-  int (*p)[n];                 // { dg-error "" }
-  int (&r)[n] = a;             // { dg-error "" }
-  struct A
-  {
-    int a[n];                  // { dg-error "" }
-  };
-}
-
-template <class T>
-void g(int n)
-{
-  int a[n];
-  int aa[n][n];                        // { dg-error "" }
-  &a;                          // { dg-error "" }
-  sizeof a;                    // { dg-error "" }
-  typeid(a);                   // { dg-error "" }
-  decltype(a) a2;              // { dg-error "" }
-  typedef int at[n];           // { dg-error "" }
-  int (*p)[n];                 // { dg-error "" }
-  int (&r)[n] = a;             // { dg-error "" }
-  struct A
-  {
-    int a[n];                  // { dg-error "" }
-  };
-}
-
-template void g<int>(int);
index 38fb145ae20f244c34ab93b1d115cd167be6cbdf..f81ab9bd1cd35520c0518278fd2d4144129ea754 100644 (file)
@@ -1,5 +1,6 @@
 // PR c++/57402
-// { dg-do compile { target c++14 } }
+// { dg-do run }
+// { dg-options "" }
 
 int i = 2;
 
diff --git a/gcc/testsuite/g++.dg/cpp1y/vla11.C b/gcc/testsuite/g++.dg/cpp1y/vla11.C
deleted file mode 100644 (file)
index ca22635..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-// PR c++/60251
-// { dg-do compile { target c++14 } }
-
-void foo(int n)
-{
-  int x[n];
-  [&x]() { decltype(x) y; }; // { dg-error "decltype of array of runtime bound" }
-}
diff --git a/gcc/testsuite/g++.dg/cpp1y/vla12.C b/gcc/testsuite/g++.dg/cpp1y/vla12.C
deleted file mode 100644 (file)
index 7fc9987..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-// PR c++/60250
-// { dg-do compile { target c++14 } }
-
-template<typename> void foo()
-{
-  typedef int T[ ([](){ return 1; }()) ]; // { dg-error "runtime bound" }
-}
diff --git a/gcc/testsuite/g++.dg/cpp1y/vla13.C b/gcc/testsuite/g++.dg/cpp1y/vla13.C
deleted file mode 100644 (file)
index f5dab26..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-// PR c++/60227
-// { dg-do compile { target c++14 } }
-
-void foo(int n)
-{
-  int a[n];
-  int (&r)[n] = {};            // { dg-error "" }
-}
index c9a452d9512a5b8c558ab65fdb7e57952e1496fc..07c300884a37ef43ab248dbed22a3a4d1b0c813e 100644 (file)
@@ -1,5 +1,6 @@
 // N3639 allows initialization and capture of VLAs
-// { dg-do run { target c++14 } }
+// { dg-do run { target c++11 } }
+// { dg-options "-Wno-vla" }
 
 void f(int n)
 {
diff --git a/gcc/testsuite/g++.dg/cpp1y/vla3.C b/gcc/testsuite/g++.dg/cpp1y/vla3.C
deleted file mode 100644 (file)
index a3d8adb..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-// Test for throwing bad_array_length on invalid array length
-// { dg-do run { target c++14 } }
-
-#include <new>
-
-int f(int i)
-{
-  int ar[i]{1,2,3,4};
-  return ar[i-1];
-}
-
-void g(int i)
-{
-  int ar[i];
-  ar[0] = 42;
-}
-
-int main()
-{
-  int ok = 0;
-  f(4);                                // OK
-  try { f(3); }                        // too small
-  catch (std::bad_array_length) { ++ok; }
-  try { g(-24); }              // negative
-  catch (std::bad_array_length) { ++ok; }
-
-  if (ok != 2)
-    __builtin_abort ();
-}
index 29df98c7ce45f6af89f02e5c76fc9bbdc86e5fdc..74bf66a07d9dcd1fc733859112f377b834d143ff 100644 (file)
@@ -1,5 +1,6 @@
 // Test for range-based for with VLAs.
-// { dg-do run { target c++14 } }
+// { dg-do run { target c++11 } }
+// { dg-options "-Wno-vla" }
 
 #include <new>
 
index cc67a75b5dc1e1759285877b9708f1b6a9af3491..6bfbece9174ca19075185c3792d41a753fc0fc63 100644 (file)
@@ -1,5 +1,6 @@
 // PR c++/55149
-// { dg-do compile { target c++14 } }
+// { dg-do compile { target c++11 } }
+// { dg-options "-Wno-vla" }
 
 void test(int n) {
   int r[n];
index 2c821e14c46b23c9c162c47c1a29569750d5b25c..68cafe585e97da75f54d21030847405295327893 100644 (file)
@@ -1,5 +1,6 @@
 // PR c++/55149
-// { dg-do compile { target c++14 } }
+// { dg-do compile { target c++11 } }
+// { dg-options "-Wno-vla" }
 
 template<unsigned int TA>
  struct SA
index eb58e1a01f827bbd28ff9a0557e217bd7bbb95e7..939de30a3c1765e6e35ec3d26b681eb4d101e707 100644 (file)
@@ -1,5 +1,6 @@
 // PR c++/57408
-// { dg-do compile { target c++14 } }
+// { dg-do compile { target c++11 } }
+// { dg-options "-Wno-vla" }
 
 template<typename Callable>
   struct Impl
@@ -19,7 +20,7 @@ extern "C" int printf(const char*, ...);
 
 int main(){
     int y = 2;
-    float fa[2][y];        // { dg-error "array of array of runtime bound" }
+    float fa[2][y];
     fa[0][0]=0.8;
     fa[0][1]=1.8;
     auto fx=[&](){
index c283a187d01bf75b3b21fab21b22d66076e97f9f..e733f481f3e32556bd55881c2f6280787b072eb0 100644 (file)
@@ -1,6 +1,6 @@
 // Test that auto works with VLAs.
 // { dg-do compile { target c++11 } }
-// { dg-options "" { target { ! c++14 } } }
+// { dg-options "-Wno-vla" }
 
 void bar(int n)
 {
index 70396133bc8b6c2762a29ea3c7197ab22a1d29ea..0c125ecd731a1b10ef3e114e9ef2e18a7a545c41 100644 (file)
@@ -1,3 +1,10 @@
+2014-12-11  Jason Merrill  <jason@redhat.com>
+
+       * libsupc++/new (bad_array_length): Move...
+       * bad_array_length.cc: ...here.
+       * cxxabi.h, eh_aux_runtime.cc (__cxa_throw_bad_array_new_length): Also
+       move to bad_array_length.cc.
+
 2014-12-11  Jonathan Wakely  <jwakely@redhat.com>
 
        * testsuite/30_threads/condition_variable/members/3.cc: Only use
index c5370c34e0d49537fb72b65eecd7cd32af8c6528..0230a381a3ba632986248311cc7bd0886557272e 100644 (file)
 
 namespace std 
 {
+// From N3639.  This was voted in and then back out of C++14, and is now
+// just here for backward link compatibility with code built with 4.9.
+class bad_array_length : public bad_alloc
+{
+public:
+  bad_array_length() throw() { };
+
+  // This declaration is not useless:
+  // http://gcc.gnu.org/onlinedocs/gcc-3.0.2/gcc_6.html#SEC118
+  virtual ~bad_array_length() throw();
+
+  // See comment in eh_exception.cc.
+  virtual const char* what() const throw();
+};
 
 bad_array_length::~bad_array_length() _GLIBCXX_USE_NOEXCEPT { }
 
@@ -33,3 +47,11 @@ bad_array_length::what() const _GLIBCXX_USE_NOEXCEPT
 { return "std::bad_array_length"; }
 
 } // namespace std
+
+namespace __cxxabiv1 {
+
+extern "C" void
+__cxa_throw_bad_array_length ()
+{ _GLIBCXX_THROW_OR_ABORT(std::bad_array_length()); }
+
+} // namespace __cxxabiv1
index 4d9458c2e84b15d38eea559d56ac740483ded232..36048f33dc03cf53d80e50dac3a9fb93a0c96bce 100644 (file)
@@ -154,9 +154,6 @@ namespace __cxxabiv1
   void
   __cxa_throw_bad_array_new_length() __attribute__((__noreturn__));
 
-  void
-  __cxa_throw_bad_array_length() __attribute__((__noreturn__));
-
   /**
    *  @brief Demangling routine.
    *  ABI-mandated entry point in the C++ runtime library for demangling.
index 3b4037a863f823effb332591843f9d77fba91b05..1846aa2c205022fc4f3513cd977c4009462f5ce0 100644 (file)
@@ -40,7 +40,3 @@ __cxxabiv1::__cxa_bad_typeid ()
 extern "C" void
 __cxxabiv1::__cxa_throw_bad_array_new_length ()
 { _GLIBCXX_THROW_OR_ABORT(std::bad_array_new_length()); }
-
-extern "C" void
-__cxxabiv1::__cxa_throw_bad_array_length ()
-{ _GLIBCXX_THROW_OR_ABORT(std::bad_array_length()); }
index a65a0b834109ef40fd339db9a2126a4cbd7e47f0..76eddfcb03844e11044acdbe99c068480a41c6b0 100644 (file)
@@ -79,23 +79,6 @@ namespace std
   };
 #endif
 
-  // We throw this exception for GNU VLAs of negative length in all C++
-  // dialects, so declare it if we aren't in strict conformance mode.
-#if __cplusplus > 201103L || !defined(__STRICT_ANSI__)
-  class bad_array_length : public bad_alloc
-  {
-  public:
-    bad_array_length() throw() { };
-
-    // This declaration is not useless:
-    // http://gcc.gnu.org/onlinedocs/gcc-3.0.2/gcc_6.html#SEC118
-    virtual ~bad_array_length() throw();
-
-    // See comment in eh_exception.cc.
-    virtual const char* what() const throw();
-  };
-#endif
-
   struct nothrow_t { };
 
   extern const nothrow_t nothrow;