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#ifdef _LIBCPP_NO_EXCEPTIONS
48#include <cstdlib>
49#endif
50
51#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
52#pragma GCC system_header
53#endif
54
55_LIBCPP_BEGIN_NAMESPACE_STD
56
57class _LIBCPP_HIDDEN __libcpp_refstring
58{
59    const char* __imp_;
60
61    bool __uses_refcount() const;
62public:
63    explicit __libcpp_refstring(const char* __msg);
64    __libcpp_refstring(const __libcpp_refstring& __s) _NOEXCEPT;
65    __libcpp_refstring& operator=(const __libcpp_refstring& __s) _NOEXCEPT;
66    ~__libcpp_refstring();
67
68    const char* c_str() const _NOEXCEPT {return __imp_;}
69};
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{
79private:
80    _VSTD::__libcpp_refstring __imp_;
81public:
82    explicit logic_error(const string&);
83    explicit logic_error(const char*);
84
85    logic_error(const logic_error&) _NOEXCEPT;
86    logic_error& operator=(const logic_error&) _NOEXCEPT;
87
88    virtual ~logic_error() _NOEXCEPT;
89
90    virtual const char* what() const _NOEXCEPT;
91};
92
93class _LIBCPP_EXCEPTION_ABI runtime_error
94    : public exception
95{
96private:
97    _VSTD::__libcpp_refstring __imp_;
98public:
99    explicit runtime_error(const string&);
100    explicit runtime_error(const char*);
101
102    runtime_error(const runtime_error&) _NOEXCEPT;
103    runtime_error& operator=(const runtime_error&) _NOEXCEPT;
104
105    virtual ~runtime_error() _NOEXCEPT;
106
107    virtual const char* what() const _NOEXCEPT;
108};
109
110class _LIBCPP_EXCEPTION_ABI domain_error
111    : public logic_error
112{
113public:
114    _LIBCPP_INLINE_VISIBILITY explicit domain_error(const string& __s) : logic_error(__s) {}
115    _LIBCPP_INLINE_VISIBILITY explicit domain_error(const char* __s)   : logic_error(__s) {}
116
117    virtual ~domain_error() _NOEXCEPT;
118};
119
120class _LIBCPP_EXCEPTION_ABI invalid_argument
121    : public logic_error
122{
123public:
124    _LIBCPP_INLINE_VISIBILITY explicit invalid_argument(const string& __s) : logic_error(__s) {}
125    _LIBCPP_INLINE_VISIBILITY explicit invalid_argument(const char* __s)   : logic_error(__s) {}
126
127    virtual ~invalid_argument() _NOEXCEPT;
128};
129
130class _LIBCPP_EXCEPTION_ABI length_error
131    : public logic_error
132{
133public:
134    _LIBCPP_INLINE_VISIBILITY explicit length_error(const string& __s) : logic_error(__s) {}
135    _LIBCPP_INLINE_VISIBILITY explicit length_error(const char* __s)   : logic_error(__s) {}
136
137    virtual ~length_error() _NOEXCEPT;
138};
139
140class _LIBCPP_EXCEPTION_ABI out_of_range
141    : public logic_error
142{
143public:
144    _LIBCPP_INLINE_VISIBILITY explicit out_of_range(const string& __s) : logic_error(__s) {}
145    _LIBCPP_INLINE_VISIBILITY explicit out_of_range(const char* __s)   : logic_error(__s) {}
146
147    virtual ~out_of_range() _NOEXCEPT;
148};
149
150class _LIBCPP_EXCEPTION_ABI range_error
151    : public runtime_error
152{
153public:
154    _LIBCPP_INLINE_VISIBILITY explicit range_error(const string& __s) : runtime_error(__s) {}
155    _LIBCPP_INLINE_VISIBILITY explicit range_error(const char* __s)   : runtime_error(__s) {}
156
157    virtual ~range_error() _NOEXCEPT;
158};
159
160class _LIBCPP_EXCEPTION_ABI overflow_error
161    : public runtime_error
162{
163public:
164    _LIBCPP_INLINE_VISIBILITY explicit overflow_error(const string& __s) : runtime_error(__s) {}
165    _LIBCPP_INLINE_VISIBILITY explicit overflow_error(const char* __s)   : runtime_error(__s) {}
166
167    virtual ~overflow_error() _NOEXCEPT;
168};
169
170class _LIBCPP_EXCEPTION_ABI underflow_error
171    : public runtime_error
172{
173public:
174    _LIBCPP_INLINE_VISIBILITY explicit underflow_error(const string& __s) : runtime_error(__s) {}
175    _LIBCPP_INLINE_VISIBILITY explicit underflow_error(const char* __s)   : runtime_error(__s) {}
176
177    virtual ~underflow_error() _NOEXCEPT;
178};
179
180}  // std
181
182_LIBCPP_BEGIN_NAMESPACE_STD
183
184// in the dylib
185_LIBCPP_NORETURN _LIBCPP_FUNC_VIS void __throw_runtime_error(const char*);
186
187_LIBCPP_NORETURN inline _LIBCPP_INLINE_VISIBILITY
188void __throw_logic_error(const char*__msg)
189{
190#ifndef _LIBCPP_NO_EXCEPTIONS
191    throw logic_error(__msg);
192#else
193    ((void)__msg);
194    _VSTD::abort();
195#endif
196}
197
198_LIBCPP_NORETURN inline _LIBCPP_INLINE_VISIBILITY
199void __throw_domain_error(const char*__msg)
200{
201#ifndef _LIBCPP_NO_EXCEPTIONS
202    throw domain_error(__msg);
203#else
204    ((void)__msg);
205    _VSTD::abort();
206#endif
207}
208
209_LIBCPP_NORETURN inline _LIBCPP_INLINE_VISIBILITY
210void __throw_invalid_argument(const char*__msg)
211{
212#ifndef _LIBCPP_NO_EXCEPTIONS
213    throw invalid_argument(__msg);
214#else
215    ((void)__msg);
216    _VSTD::abort();
217#endif
218}
219
220_LIBCPP_NORETURN inline _LIBCPP_INLINE_VISIBILITY
221void __throw_length_error(const char*__msg)
222{
223#ifndef _LIBCPP_NO_EXCEPTIONS
224    throw length_error(__msg);
225#else
226    ((void)__msg);
227    _VSTD::abort();
228#endif
229}
230
231_LIBCPP_NORETURN inline _LIBCPP_INLINE_VISIBILITY
232void __throw_out_of_range(const char*__msg)
233{
234#ifndef _LIBCPP_NO_EXCEPTIONS
235    throw out_of_range(__msg);
236#else
237    ((void)__msg);
238    _VSTD::abort();
239#endif
240}
241
242_LIBCPP_NORETURN inline _LIBCPP_INLINE_VISIBILITY
243void __throw_range_error(const char*__msg)
244{
245#ifndef _LIBCPP_NO_EXCEPTIONS
246    throw range_error(__msg);
247#else
248    ((void)__msg);
249    _VSTD::abort();
250#endif
251}
252
253_LIBCPP_NORETURN inline _LIBCPP_INLINE_VISIBILITY
254void __throw_overflow_error(const char*__msg)
255{
256#ifndef _LIBCPP_NO_EXCEPTIONS
257    throw overflow_error(__msg);
258#else
259    ((void)__msg);
260    _VSTD::abort();
261#endif
262}
263
264_LIBCPP_NORETURN inline _LIBCPP_INLINE_VISIBILITY
265void __throw_underflow_error(const char*__msg)
266{
267#ifndef _LIBCPP_NO_EXCEPTIONS
268    throw underflow_error(__msg);
269#else
270    ((void)__msg);
271    _VSTD::abort();
272#endif
273}
274
275_LIBCPP_END_NAMESPACE_STD
276
277#endif  // _LIBCPP_STDEXCEPT
278