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