[c++11] Question about __cxa_throw_bad_array_new_length

Alexander Ivchenko aivchenk@gmail.com
Mon Sep 23 12:09:00 GMT 2013


Hi,

When I compile the following code (modified version of
g++.dg/cpp0x/bad_array_new1.C without try/catch):

// { dg-options -std=c++11 }
// { dg-do run }

#include <new>

void * f(int i)
{
  return new int[i];
}

int main()
{
      f(-1);
}

with -fno-exceptions option, I still get the call to
__cxa_throw_bad_array_new_length:

> nm ./bad_array_new1.o | grep cxa
    U __cxa_throw_bad_array_new_length


The same goes for __cxa_throw_bad_array_length. Is it an expected behaviour?

May be I am missing something, but I would say that this is a bug and we should
add something like the following checks:


diff --git a/gcc/cp/call.c b/gcc/cp/call.c
index 3ed73b8..c947484 100644
--- a/gcc/cp/call.c
+++ b/gcc/cp/call.c
@@ -3953,7 +3953,7 @@ build_operator_new_call (tree fnname, vec<tree,
va_gc> **args,
   if (size_check != NULL_TREE)
     {
       tree errval = TYPE_MAX_VALUE (sizetype);
-      if (cxx_dialect >= cxx11)
+      if (cxx_dialect >= cxx11 && flag_exceptions)
        errval = throw_bad_array_new_length ();
       *size = fold_build3 (COND_EXPR, sizetype, size_check,
                           original_size, errval);
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index 80ceca1..d058e94 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -6390,7 +6390,9 @@ cp_finish_decl (tree decl, tree init, bool
init_const_expr_p,
           && TYPE_FOR_JAVA (type) && MAYBE_CLASS_TYPE_P (type))
     error ("non-static data member %qD has Java class type", decl);

-  if (cxx_dialect >= cxx1y && array_of_runtime_bound_p (type))
+  if (cxx_dialect >= cxx1y
+      && array_of_runtime_bound_p (type)
+      && flag_exceptions)
     {
       /* If the VLA bound is larger than half the address space, or less
         than zero, throw std::bad_array_length.  */
diff --git a/gcc/cp/init.c b/gcc/cp/init.c
index 8fabdcd..53046ab 100644
--- a/gcc/cp/init.c
+++ b/gcc/cp/init.c
@@ -2488,7 +2488,7 @@ build_new_1 (vec<tree, va_gc> **placement, tree
type, tree nelts,
            }
          /* Perform the overflow check.  */
          tree errval = TYPE_MAX_VALUE (sizetype);
-         if (cxx_dialect >= cxx11)
+         if (cxx_dialect >= cxx11 && flag_exceptions)
            errval = throw_bad_array_new_length ();
          if (outer_nelts_check != NULL_TREE)
             size = fold_build3 (COND_EXPR, sizetype, outer_nelts_check,
@@ -3345,7 +3345,8 @@ build_vec_init (tree base, tree maxindex, tree init,
      is big enough for all the initializers.  */
   if (init && TREE_CODE (init) == CONSTRUCTOR
       && CONSTRUCTOR_NELTS (init) > 0
-      && !TREE_CONSTANT (maxindex))
+      && !TREE_CONSTANT (maxindex)
+      && flag_exceptions)
     length_check = fold_build2 (LT_EXPR, boolean_type_node, maxindex,
                                size_int (CONSTRUCTOR_NELTS (init) - 1));


thanks,
Alexander



More information about the Gcc mailing list