stdexcept revision 1.1.1.1 1 // -*- C++ -*-
2 //===--------------------------- stdexcept --------------------------------===//
3 //
4 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5 // See https://llvm.org/LICENSE.txt for license information.
6 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //
8 //===----------------------------------------------------------------------===//
9
10 #ifndef _LIBCPP_STDEXCEPT
11 #define _LIBCPP_STDEXCEPT
12
13 /*
14 stdexcept synopsis
15
16 namespace std
17 {
18
19 class logic_error;
20 class domain_error;
21 class invalid_argument;
22 class length_error;
23 class out_of_range;
24 class runtime_error;
25 class range_error;
26 class overflow_error;
27 class underflow_error;
28
29 for each class xxx_error:
30
31 class xxx_error : public exception // at least indirectly
32 {
33 public:
34 explicit xxx_error(const string& what_arg);
35 explicit xxx_error(const char* what_arg);
36
37 virtual const char* what() const noexcept // returns what_arg
38 };
39
40 } // std
41
42 */
43
44 #include <__config>
45 #include <cstdlib>
46 #include <exception>
47 #include <iosfwd> // for string forward decl
48
49 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
50 #pragma GCC system_header
51 #endif
52
53 _LIBCPP_BEGIN_NAMESPACE_STD
54
55 #ifndef _LIBCPP_ABI_VCRUNTIME
56 class _LIBCPP_HIDDEN __libcpp_refstring
57 {
58 const char* __imp_;
59
60 bool __uses_refcount() const;
61 public:
62 explicit __libcpp_refstring(const char* __msg);
63 __libcpp_refstring(const __libcpp_refstring& __s) _NOEXCEPT;
64 __libcpp_refstring& operator=(const __libcpp_refstring& __s) _NOEXCEPT;
65 ~__libcpp_refstring();
66
67 const char* c_str() const _NOEXCEPT {return __imp_;}
68 };
69 #endif // !_LIBCPP_ABI_VCRUNTIME
70
71 _LIBCPP_END_NAMESPACE_STD
72
73 namespace std // purposefully not using versioning namespace
74 {
75
76 class _LIBCPP_EXCEPTION_ABI logic_error
77 : public exception
78 {
79 #ifndef _LIBCPP_ABI_VCRUNTIME
80 private:
81 _VSTD::__libcpp_refstring __imp_;
82 public:
83 explicit logic_error(const string&);
84 explicit logic_error(const char*);
85
86 logic_error(const logic_error&) _NOEXCEPT;
87 logic_error& operator=(const logic_error&) _NOEXCEPT;
88
89 virtual ~logic_error() _NOEXCEPT;
90
91 virtual const char* what() const _NOEXCEPT;
92 #else
93 public:
94 explicit logic_error(const _VSTD::string&); // Symbol uses versioned std::string
95 _LIBCPP_INLINE_VISIBILITY explicit logic_error(const char* __s) : exception(__s) {}
96 #endif
97 };
98
99 class _LIBCPP_EXCEPTION_ABI runtime_error
100 : public exception
101 {
102 #ifndef _LIBCPP_ABI_VCRUNTIME
103 private:
104 _VSTD::__libcpp_refstring __imp_;
105 public:
106 explicit runtime_error(const string&);
107 explicit runtime_error(const char*);
108
109 runtime_error(const runtime_error&) _NOEXCEPT;
110 runtime_error& operator=(const runtime_error&) _NOEXCEPT;
111
112 virtual ~runtime_error() _NOEXCEPT;
113
114 virtual const char* what() const _NOEXCEPT;
115 #else
116 public:
117 explicit runtime_error(const _VSTD::string&); // Symbol uses versioned std::string
118 _LIBCPP_INLINE_VISIBILITY explicit runtime_error(const char* __s) : exception(__s) {}
119 #endif // _LIBCPP_ABI_VCRUNTIME
120 };
121
122 class _LIBCPP_EXCEPTION_ABI domain_error
123 : public logic_error
124 {
125 public:
126 _LIBCPP_INLINE_VISIBILITY explicit domain_error(const string& __s) : logic_error(__s) {}
127 _LIBCPP_INLINE_VISIBILITY explicit domain_error(const char* __s) : logic_error(__s) {}
128
129 #ifndef _LIBCPP_ABI_VCRUNTIME
130 domain_error(const domain_error&) _NOEXCEPT = default;
131 virtual ~domain_error() _NOEXCEPT;
132 #endif
133 };
134
135 class _LIBCPP_EXCEPTION_ABI invalid_argument
136 : public logic_error
137 {
138 public:
139 _LIBCPP_INLINE_VISIBILITY explicit invalid_argument(const string& __s) : logic_error(__s) {}
140 _LIBCPP_INLINE_VISIBILITY explicit invalid_argument(const char* __s) : logic_error(__s) {}
141
142 #ifndef _LIBCPP_ABI_VCRUNTIME
143 invalid_argument(const invalid_argument&) _NOEXCEPT = default;
144 virtual ~invalid_argument() _NOEXCEPT;
145 #endif
146 };
147
148 class _LIBCPP_EXCEPTION_ABI length_error
149 : public logic_error
150 {
151 public:
152 _LIBCPP_INLINE_VISIBILITY explicit length_error(const string& __s) : logic_error(__s) {}
153 _LIBCPP_INLINE_VISIBILITY explicit length_error(const char* __s) : logic_error(__s) {}
154 #ifndef _LIBCPP_ABI_VCRUNTIME
155 length_error(const length_error&) _NOEXCEPT = default;
156 virtual ~length_error() _NOEXCEPT;
157 #endif
158 };
159
160 class _LIBCPP_EXCEPTION_ABI out_of_range
161 : public logic_error
162 {
163 public:
164 _LIBCPP_INLINE_VISIBILITY explicit out_of_range(const string& __s) : logic_error(__s) {}
165 _LIBCPP_INLINE_VISIBILITY explicit out_of_range(const char* __s) : logic_error(__s) {}
166
167 #ifndef _LIBCPP_ABI_VCRUNTIME
168 out_of_range(const out_of_range&) _NOEXCEPT = default;
169 virtual ~out_of_range() _NOEXCEPT;
170 #endif
171 };
172
173 class _LIBCPP_EXCEPTION_ABI range_error
174 : public runtime_error
175 {
176 public:
177 _LIBCPP_INLINE_VISIBILITY explicit range_error(const string& __s) : runtime_error(__s) {}
178 _LIBCPP_INLINE_VISIBILITY explicit range_error(const char* __s) : runtime_error(__s) {}
179
180 #ifndef _LIBCPP_ABI_VCRUNTIME
181 range_error(const range_error&) _NOEXCEPT = default;
182 virtual ~range_error() _NOEXCEPT;
183 #endif
184 };
185
186 class _LIBCPP_EXCEPTION_ABI overflow_error
187 : public runtime_error
188 {
189 public:
190 _LIBCPP_INLINE_VISIBILITY explicit overflow_error(const string& __s) : runtime_error(__s) {}
191 _LIBCPP_INLINE_VISIBILITY explicit overflow_error(const char* __s) : runtime_error(__s) {}
192
193 #ifndef _LIBCPP_ABI_VCRUNTIME
194 overflow_error(const overflow_error&) _NOEXCEPT = default;
195 virtual ~overflow_error() _NOEXCEPT;
196 #endif
197 };
198
199 class _LIBCPP_EXCEPTION_ABI underflow_error
200 : public runtime_error
201 {
202 public:
203 _LIBCPP_INLINE_VISIBILITY explicit underflow_error(const string& __s) : runtime_error(__s) {}
204 _LIBCPP_INLINE_VISIBILITY explicit underflow_error(const char* __s) : runtime_error(__s) {}
205
206 #ifndef _LIBCPP_ABI_VCRUNTIME
207 underflow_error(const underflow_error&) _NOEXCEPT = default;
208 virtual ~underflow_error() _NOEXCEPT;
209 #endif
210 };
211
212 } // std
213
214 _LIBCPP_BEGIN_NAMESPACE_STD
215
216 // in the dylib
217 _LIBCPP_NORETURN _LIBCPP_FUNC_VIS void __throw_runtime_error(const char*);
218
219 _LIBCPP_NORETURN inline _LIBCPP_INLINE_VISIBILITY
220 void __throw_logic_error(const char*__msg)
221 {
222 #ifndef _LIBCPP_NO_EXCEPTIONS
223 throw logic_error(__msg);
224 #else
225 ((void)__msg);
226 _VSTD::abort();
227 #endif
228 }
229
230 _LIBCPP_NORETURN inline _LIBCPP_INLINE_VISIBILITY
231 void __throw_domain_error(const char*__msg)
232 {
233 #ifndef _LIBCPP_NO_EXCEPTIONS
234 throw domain_error(__msg);
235 #else
236 ((void)__msg);
237 _VSTD::abort();
238 #endif
239 }
240
241 _LIBCPP_NORETURN inline _LIBCPP_INLINE_VISIBILITY
242 void __throw_invalid_argument(const char*__msg)
243 {
244 #ifndef _LIBCPP_NO_EXCEPTIONS
245 throw invalid_argument(__msg);
246 #else
247 ((void)__msg);
248 _VSTD::abort();
249 #endif
250 }
251
252 _LIBCPP_NORETURN inline _LIBCPP_INLINE_VISIBILITY
253 void __throw_length_error(const char*__msg)
254 {
255 #ifndef _LIBCPP_NO_EXCEPTIONS
256 throw length_error(__msg);
257 #else
258 ((void)__msg);
259 _VSTD::abort();
260 #endif
261 }
262
263 _LIBCPP_NORETURN inline _LIBCPP_INLINE_VISIBILITY
264 void __throw_out_of_range(const char*__msg)
265 {
266 #ifndef _LIBCPP_NO_EXCEPTIONS
267 throw out_of_range(__msg);
268 #else
269 ((void)__msg);
270 _VSTD::abort();
271 #endif
272 }
273
274 _LIBCPP_NORETURN inline _LIBCPP_INLINE_VISIBILITY
275 void __throw_range_error(const char*__msg)
276 {
277 #ifndef _LIBCPP_NO_EXCEPTIONS
278 throw range_error(__msg);
279 #else
280 ((void)__msg);
281 _VSTD::abort();
282 #endif
283 }
284
285 _LIBCPP_NORETURN inline _LIBCPP_INLINE_VISIBILITY
286 void __throw_overflow_error(const char*__msg)
287 {
288 #ifndef _LIBCPP_NO_EXCEPTIONS
289 throw overflow_error(__msg);
290 #else
291 ((void)__msg);
292 _VSTD::abort();
293 #endif
294 }
295
296 _LIBCPP_NORETURN inline _LIBCPP_INLINE_VISIBILITY
297 void __throw_underflow_error(const char*__msg)
298 {
299 #ifndef _LIBCPP_NO_EXCEPTIONS
300 throw underflow_error(__msg);
301 #else
302 ((void)__msg);
303 _VSTD::abort();
304 #endif
305 }
306
307 _LIBCPP_END_NAMESPACE_STD
308
309 #endif // _LIBCPP_STDEXCEPT
310