Index: CREDITS.TXT
===================================================================
--- CREDITS.TXT	(revision 216677)
+++ CREDITS.TXT	(working copy)
@@ -8,6 +8,10 @@
 (W), PGP key ID and fingerprint (P), description (D), and snail-mail address
 (S).
 
+N: Aaron Ballman
+E: aaron@aaronballman.com
+D: Minor patches
+
 N: Logan Chien
 E: logan.chien@mediatek.com
 D: ARM EHABI Unwind & Exception Handling
Index: include/cxxabi.h
===================================================================
--- include/cxxabi.h	(revision 216677)
+++ include/cxxabi.h	(working copy)
@@ -66,6 +66,7 @@
 // 2.6 Auxiliary Runtime APIs
 extern LIBCXXABI_NORETURN void __cxa_bad_cast(void);
 extern LIBCXXABI_NORETURN void __cxa_bad_typeid(void);
+extern LIBCXXABI_NORETURN void __cxa_throw_bad_array_new_length(void);
 
 
 
Index: src/cxa_aux_runtime.cpp
===================================================================
--- src/cxa_aux_runtime.cpp	(revision 216677)
+++ src/cxa_aux_runtime.cpp	(working copy)
@@ -29,6 +29,10 @@
     throw std::bad_typeid();
 }
 
+LIBCXXABI_NORETURN
+void __cxa_throw_bad_array_new_length(void) {
+    throw std::bad_array_new_length();
+}
 }  // extern "C"
 
 }  // abi
Index: test/test_aux_runtime_op_array_new.cpp
===================================================================
--- test/test_aux_runtime_op_array_new.cpp	(revision 0)
+++ test/test_aux_runtime_op_array_new.cpp	(working copy)
@@ -0,0 +1,38 @@
+// XFAIL: *
+// This test currently fails because Clang does not currently codegen the
+// correct call to __cxa_bad_array_new_length, so this test would result in
+// passing -1 to ::operator new[], which would then throw a std::bad_alloc,
+// causing the test to fail.
+
+//===-------------------------- test_aux_runtime_op_array_new.cpp ---------===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is dual licensed under the MIT and the University of Illinois Open
+// Source Licenses. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include <iostream>
+#include <limits>
+#include <new>
+
+//  If the expression passed to operator new[] would result in an overflow, the
+//  allocation function is not called, and a std::bad_array_new_length exception
+//  is thrown instead (5.3.4p7).
+bool bad_array_new_length_test () {
+	try { int *I = new int[std::numeric_limits<size_t>::max()]; }
+	catch ( const std::bad_array_new_length &banl ) { return true; }
+	return false;
+    }
+
+int main ( int argc, char *argv [] ) {
+    int ret_val = 0;
+
+    if ( !bad_array_new_length_test ()) {
+        std::cerr << "Bad array new length test failed!" << std::endl;
+        ret_val = 1;
+    }
+
+    return ret_val;
+    }
