Index: include/new
===================================================================
--- include/new	(revision 190305)
+++ include/new	(working copy)
@@ -27,6 +27,18 @@
     virtual const char* what() const noexcept;
 };
 
+class bad_array_length : public bad_alloc // C++14
+{
+public:
+    bad_array_length() noexcept;
+};
+
+class bad_array_new_length : public bad_alloc
+{
+public:
+    bad_array_new_length() noexcept;
+};
+
 struct nothrow_t {};
 extern const nothrow_t nothrow;
 typedef void (*new_handler)();
@@ -81,6 +93,17 @@
     virtual const char* what() const _NOEXCEPT;
 };
 
+#if defined(_LIBCPP_BUILDING_NEW) || (_LIBCPP_STD_VER > 11)
+class _LIBCPP_EXCEPTION_ABI bad_array_length
+    : public bad_alloc
+{
+public:
+    bad_array_length() _NOEXCEPT;
+    virtual ~bad_array_length() _NOEXCEPT;
+    virtual const char* what() const _NOEXCEPT;
+};
+#endif
+
 _LIBCPP_FUNC_VIS void __throw_bad_alloc();  // not in C++ spec
 
 struct _LIBCPP_TYPE_VIS nothrow_t {};
Index: src/new.cpp
===================================================================
--- src/new.cpp	(revision 190305)
+++ src/new.cpp	(working copy)
@@ -7,6 +7,8 @@
 //
 //===----------------------------------------------------------------------===//
 
+#define	_LIBCPP_BUILDING_NEW
+
 #include <stdlib.h>
 
 #include "new"
@@ -187,12 +189,26 @@
 }
 
 const char*
+bad_array_length::what() const _NOEXCEPT
+{
+    return "bad_array_length";
+}
+
+bad_array_length::bad_array_length() _NOEXCEPT
+{
+}
+
+bad_array_length::~bad_array_length() _NOEXCEPT
+{
+}
+
+const char*
 bad_array_new_length::what() const _NOEXCEPT
 {
     return "bad_array_new_length";
 }
 
-#endif
+#endif // _LIBCPPABI_VERSION
 
 void
 __throw_bad_alloc()
Index: test/language.support/support.dynamic/alloc.errors/new.badlength/bad_array_length.pass.cpp
===================================================================
--- test/language.support/support.dynamic/alloc.errors/new.badlength/bad_array_length.pass.cpp	(revision 0)
+++ test/language.support/support.dynamic/alloc.errors/new.badlength/bad_array_length.pass.cpp	(revision 0)
@@ -0,0 +1,29 @@
+//===----------------------------------------------------------------------===//
+//
+//                     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.
+//
+//===----------------------------------------------------------------------===//
+
+// test bad_array_length
+
+#include <new>
+#include <type_traits>
+#include <cassert>
+
+int main()
+{
+#if __LIBCPP_STD_VER > 11
+    static_assert((std::is_base_of<std::bad_alloc, std::bad_array_length>::value),
+                  "std::is_base_of<std::bad_alloc, std::bad_array_length>::value");
+    static_assert(std::is_polymorphic<std::bad_array_length>::value,
+                 "std::is_polymorphic<std::bad_array_length>::value");
+    std::bad_array_length b;
+    std::bad_array_length b2 = b;
+    b2 = b;
+    const char* w = b2.what();
+    assert(w);
+#endif
+}
