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