1*9474e094SLouis Dionne //===----------------------------------------------------------------------===// 2*9474e094SLouis Dionne // 3*9474e094SLouis Dionne // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*9474e094SLouis Dionne // See https://llvm.org/LICENSE.txt for license information. 5*9474e094SLouis Dionne // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*9474e094SLouis Dionne // 7*9474e094SLouis Dionne //===----------------------------------------------------------------------===// 8*9474e094SLouis Dionne 9*9474e094SLouis Dionne #ifndef _LIBCPP___NEW_EXCEPTIONS_H 10*9474e094SLouis Dionne #define _LIBCPP___NEW_EXCEPTIONS_H 11*9474e094SLouis Dionne 12*9474e094SLouis Dionne #include <__config> 13*9474e094SLouis Dionne #include <__exception/exception.h> 14*9474e094SLouis Dionne #include <__verbose_abort> 15*9474e094SLouis Dionne 16*9474e094SLouis Dionne #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 17*9474e094SLouis Dionne # pragma GCC system_header 18*9474e094SLouis Dionne #endif 19*9474e094SLouis Dionne 20*9474e094SLouis Dionne // purposefully not using versioning namespace 21*9474e094SLouis Dionne namespace std { 22*9474e094SLouis Dionne #if !defined(_LIBCPP_ABI_VCRUNTIME) 23*9474e094SLouis Dionne 24*9474e094SLouis Dionne class _LIBCPP_EXPORTED_FROM_ABI bad_alloc : public exception { 25*9474e094SLouis Dionne public: 26*9474e094SLouis Dionne bad_alloc() _NOEXCEPT; 27*9474e094SLouis Dionne _LIBCPP_HIDE_FROM_ABI bad_alloc(const bad_alloc&) _NOEXCEPT = default; 28*9474e094SLouis Dionne _LIBCPP_HIDE_FROM_ABI bad_alloc& operator=(const bad_alloc&) _NOEXCEPT = default; 29*9474e094SLouis Dionne ~bad_alloc() _NOEXCEPT override; 30*9474e094SLouis Dionne const char* what() const _NOEXCEPT override; 31*9474e094SLouis Dionne }; 32*9474e094SLouis Dionne 33*9474e094SLouis Dionne class _LIBCPP_EXPORTED_FROM_ABI bad_array_new_length : public bad_alloc { 34*9474e094SLouis Dionne public: 35*9474e094SLouis Dionne bad_array_new_length() _NOEXCEPT; 36*9474e094SLouis Dionne _LIBCPP_HIDE_FROM_ABI bad_array_new_length(const bad_array_new_length&) _NOEXCEPT = default; 37*9474e094SLouis Dionne _LIBCPP_HIDE_FROM_ABI bad_array_new_length& operator=(const bad_array_new_length&) _NOEXCEPT = default; 38*9474e094SLouis Dionne ~bad_array_new_length() _NOEXCEPT override; 39*9474e094SLouis Dionne const char* what() const _NOEXCEPT override; 40*9474e094SLouis Dionne }; 41*9474e094SLouis Dionne 42*9474e094SLouis Dionne #elif defined(_HAS_EXCEPTIONS) && _HAS_EXCEPTIONS == 0 // !_LIBCPP_ABI_VCRUNTIME 43*9474e094SLouis Dionne 44*9474e094SLouis Dionne // When _HAS_EXCEPTIONS == 0, these complete definitions are needed, 45*9474e094SLouis Dionne // since they would normally be provided in vcruntime_exception.h 46*9474e094SLouis Dionne class bad_alloc : public exception { 47*9474e094SLouis Dionne public: 48*9474e094SLouis Dionne bad_alloc() noexcept : exception("bad allocation") {} 49*9474e094SLouis Dionne 50*9474e094SLouis Dionne private: 51*9474e094SLouis Dionne friend class bad_array_new_length; 52*9474e094SLouis Dionne 53*9474e094SLouis Dionne bad_alloc(char const* const __message) noexcept : exception(__message) {} 54*9474e094SLouis Dionne }; 55*9474e094SLouis Dionne 56*9474e094SLouis Dionne class bad_array_new_length : public bad_alloc { 57*9474e094SLouis Dionne public: 58*9474e094SLouis Dionne bad_array_new_length() noexcept : bad_alloc("bad array new length") {} 59*9474e094SLouis Dionne }; 60*9474e094SLouis Dionne 61*9474e094SLouis Dionne #endif // defined(_LIBCPP_ABI_VCRUNTIME) && defined(_HAS_EXCEPTIONS) && _HAS_EXCEPTIONS == 0 62*9474e094SLouis Dionne 63*9474e094SLouis Dionne [[__noreturn__]] _LIBCPP_EXPORTED_FROM_ABI void __throw_bad_alloc(); // not in C++ spec 64*9474e094SLouis Dionne 65*9474e094SLouis Dionne [[__noreturn__]] inline _LIBCPP_HIDE_FROM_ABI void __throw_bad_array_new_length() { 66*9474e094SLouis Dionne #if _LIBCPP_HAS_EXCEPTIONS 67*9474e094SLouis Dionne throw bad_array_new_length(); 68*9474e094SLouis Dionne #else 69*9474e094SLouis Dionne _LIBCPP_VERBOSE_ABORT("bad_array_new_length was thrown in -fno-exceptions mode"); 70*9474e094SLouis Dionne #endif 71*9474e094SLouis Dionne } 72*9474e094SLouis Dionne } // namespace std 73*9474e094SLouis Dionne 74*9474e094SLouis Dionne #endif // _LIBCPP___NEW_EXCEPTIONS_H 75