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
16namespace std
17{
18
19class logic_error;
20    class domain_error;
21    class invalid_argument;
22    class length_error;
23    class out_of_range;
24class runtime_error;
25    class range_error;
26    class overflow_error;
27    class underflow_error;
28
29for each class xxx_error:
30
31class xxx_error : public exception // at least indirectly
32{
33public:
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 <exception>
46#include <iosfwd>  // for string forward decl
47#include <cstdlib>
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
56class _LIBCPP_HIDDEN __libcpp_refstring
57{
58    const char* __imp_;
59
60    bool __uses_refcount() const;
61public:
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
73namespace std  // purposefully not using versioning namespace
74{
75
76class _LIBCPP_EXCEPTION_ABI logic_error
77    : public exception
78{
79#ifndef _LIBCPP_ABI_VCRUNTIME
80private:
81    _VSTD::__libcpp_refstring __imp_;
82public:
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
93public:
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
99class _LIBCPP_EXCEPTION_ABI runtime_error
100    : public exception
101{
102#ifndef _LIBCPP_ABI_VCRUNTIME
103private:
104    _VSTD::__libcpp_refstring __imp_;
105public:
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
116public:
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
122class _LIBCPP_EXCEPTION_ABI domain_error
123    : public logic_error
124{
125public:
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
135class _LIBCPP_EXCEPTION_ABI invalid_argument
136    : public logic_error
137{
138public:
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
148class _LIBCPP_EXCEPTION_ABI length_error
149    : public logic_error
150{
151public:
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
160class _LIBCPP_EXCEPTION_ABI out_of_range
161    : public logic_error
162{
163public:
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
173class _LIBCPP_EXCEPTION_ABI range_error
174    : public runtime_error
175{
176public:
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
186class _LIBCPP_EXCEPTION_ABI overflow_error
187    : public runtime_error
188{
189public:
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
199class _LIBCPP_EXCEPTION_ABI underflow_error
200    : public runtime_error
201{
202public:
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
220void __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
231void __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
242void __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
253void __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
264void __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
275void __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
286void __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
297void __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