blob: 481f9043c50dc540510cdf6872af99aaeefb5af4 [file] [log] [blame]
Howard Hinnantc51e1022010-05-11 19:42:16 +00001// -*- C++ -*-
2//===--------------------------- stdexcept --------------------------------===//
3//
Chandler Carruthd2012102019-01-19 10:56:40 +00004// 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
Howard Hinnantc51e1022010-05-11 19:42:16 +00007//
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);
Howard Hinnant1f098bc2011-05-26 19:48:01 +000035 explicit xxx_error(const char* what_arg);
Howard Hinnantc51e1022010-05-11 19:42:16 +000036
Howard Hinnant1f098bc2011-05-26 19:48:01 +000037 virtual const char* what() const noexcept // returns what_arg
Howard Hinnantc51e1022010-05-11 19:42:16 +000038};
39
40} // std
41
42*/
43
44#include <__config>
45#include <exception>
46#include <iosfwd> // for string forward decl
Eric Fiselier279c3192016-09-06 21:25:27 +000047#ifdef _LIBCPP_NO_EXCEPTIONS
48#include <cstdlib>
49#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +000050
Howard Hinnantaaaa52b2011-10-17 20:05:10 +000051#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
Howard Hinnantc51e1022010-05-11 19:42:16 +000052#pragma GCC system_header
Howard Hinnantaaaa52b2011-10-17 20:05:10 +000053#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +000054
Joerg Sonnenbergera47c2e72014-04-30 19:54:11 +000055_LIBCPP_BEGIN_NAMESPACE_STD
Eric Fiselier1e655162016-10-25 19:33:14 +000056
Eric Fiselierc6e689b2019-03-06 20:31:57 +000057#ifndef _LIBCPP_ABI_VCRUNTIME
Eric Fiselier1e655162016-10-25 19:33:14 +000058class _LIBCPP_HIDDEN __libcpp_refstring
59{
60 const char* __imp_;
61
62 bool __uses_refcount() const;
63public:
Eric Fiselierc5ea1ae2017-06-01 02:29:37 +000064 explicit __libcpp_refstring(const char* __msg);
65 __libcpp_refstring(const __libcpp_refstring& __s) _NOEXCEPT;
66 __libcpp_refstring& operator=(const __libcpp_refstring& __s) _NOEXCEPT;
Eric Fiselier1e655162016-10-25 19:33:14 +000067 ~__libcpp_refstring();
68
69 const char* c_str() const _NOEXCEPT {return __imp_;}
Joerg Sonnenbergera47c2e72014-04-30 19:54:11 +000070};
Eric Fiselierc6e689b2019-03-06 20:31:57 +000071#endif // !_LIBCPP_ABI_VCRUNTIME
Eric Fiselier1e655162016-10-25 19:33:14 +000072
Joerg Sonnenbergera47c2e72014-04-30 19:54:11 +000073_LIBCPP_END_NAMESPACE_STD
Joerg Sonnenbergera47c2e72014-04-30 19:54:11 +000074
Howard Hinnantc51e1022010-05-11 19:42:16 +000075namespace std // purposefully not using versioning namespace
76{
77
78class _LIBCPP_EXCEPTION_ABI logic_error
79 : public exception
80{
Eric Fiselierc6e689b2019-03-06 20:31:57 +000081#ifndef _LIBCPP_ABI_VCRUNTIME
Howard Hinnantc51e1022010-05-11 19:42:16 +000082private:
Joerg Sonnenbergera47c2e72014-04-30 19:54:11 +000083 _VSTD::__libcpp_refstring __imp_;
Howard Hinnantc51e1022010-05-11 19:42:16 +000084public:
85 explicit logic_error(const string&);
86 explicit logic_error(const char*);
87
Howard Hinnant1f098bc2011-05-26 19:48:01 +000088 logic_error(const logic_error&) _NOEXCEPT;
89 logic_error& operator=(const logic_error&) _NOEXCEPT;
Howard Hinnantc51e1022010-05-11 19:42:16 +000090
Howard Hinnant1f098bc2011-05-26 19:48:01 +000091 virtual ~logic_error() _NOEXCEPT;
Howard Hinnantc51e1022010-05-11 19:42:16 +000092
Howard Hinnant1f098bc2011-05-26 19:48:01 +000093 virtual const char* what() const _NOEXCEPT;
Eric Fiselierc6e689b2019-03-06 20:31:57 +000094#else
95public:
96 explicit logic_error(const _VSTD::string&); // Symbol uses versioned std::string
97 _LIBCPP_INLINE_VISIBILITY explicit logic_error(const char* __s) : exception(__s) {}
98#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +000099};
100
101class _LIBCPP_EXCEPTION_ABI runtime_error
102 : public exception
103{
Eric Fiselierc6e689b2019-03-06 20:31:57 +0000104#ifndef _LIBCPP_ABI_VCRUNTIME
Howard Hinnantc51e1022010-05-11 19:42:16 +0000105private:
Joerg Sonnenbergera47c2e72014-04-30 19:54:11 +0000106 _VSTD::__libcpp_refstring __imp_;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000107public:
108 explicit runtime_error(const string&);
109 explicit runtime_error(const char*);
110
Howard Hinnant1f098bc2011-05-26 19:48:01 +0000111 runtime_error(const runtime_error&) _NOEXCEPT;
112 runtime_error& operator=(const runtime_error&) _NOEXCEPT;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000113
Howard Hinnant1f098bc2011-05-26 19:48:01 +0000114 virtual ~runtime_error() _NOEXCEPT;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000115
Howard Hinnant1f098bc2011-05-26 19:48:01 +0000116 virtual const char* what() const _NOEXCEPT;
Eric Fiselierc6e689b2019-03-06 20:31:57 +0000117#else
118public:
119 explicit runtime_error(const _VSTD::string&); // Symbol uses versioned std::string
120 _LIBCPP_INLINE_VISIBILITY explicit runtime_error(const char* __s) : exception(__s) {}
121#endif // _LIBCPP_ABI_VCRUNTIME
Howard Hinnantc51e1022010-05-11 19:42:16 +0000122};
123
124class _LIBCPP_EXCEPTION_ABI domain_error
125 : public logic_error
126{
127public:
128 _LIBCPP_INLINE_VISIBILITY explicit domain_error(const string& __s) : logic_error(__s) {}
129 _LIBCPP_INLINE_VISIBILITY explicit domain_error(const char* __s) : logic_error(__s) {}
130
Eric Fiselierc6e689b2019-03-06 20:31:57 +0000131#ifndef _LIBCPP_ABI_VCRUNTIME
Howard Hinnant1f098bc2011-05-26 19:48:01 +0000132 virtual ~domain_error() _NOEXCEPT;
Eric Fiselierc6e689b2019-03-06 20:31:57 +0000133#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +0000134};
135
136class _LIBCPP_EXCEPTION_ABI invalid_argument
137 : public logic_error
138{
139public:
140 _LIBCPP_INLINE_VISIBILITY explicit invalid_argument(const string& __s) : logic_error(__s) {}
141 _LIBCPP_INLINE_VISIBILITY explicit invalid_argument(const char* __s) : logic_error(__s) {}
142
Eric Fiselierc6e689b2019-03-06 20:31:57 +0000143#ifndef _LIBCPP_ABI_VCRUNTIME
Howard Hinnant1f098bc2011-05-26 19:48:01 +0000144 virtual ~invalid_argument() _NOEXCEPT;
Eric Fiselierc6e689b2019-03-06 20:31:57 +0000145#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +0000146};
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) {}
Eric Fiselierc6e689b2019-03-06 20:31:57 +0000154#ifndef _LIBCPP_ABI_VCRUNTIME
Howard Hinnant1f098bc2011-05-26 19:48:01 +0000155 virtual ~length_error() _NOEXCEPT;
Eric Fiselierc6e689b2019-03-06 20:31:57 +0000156#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +0000157};
158
159class _LIBCPP_EXCEPTION_ABI out_of_range
160 : public logic_error
161{
162public:
163 _LIBCPP_INLINE_VISIBILITY explicit out_of_range(const string& __s) : logic_error(__s) {}
164 _LIBCPP_INLINE_VISIBILITY explicit out_of_range(const char* __s) : logic_error(__s) {}
165
Eric Fiselierc6e689b2019-03-06 20:31:57 +0000166#ifndef _LIBCPP_ABI_VCRUNTIME
Howard Hinnant1f098bc2011-05-26 19:48:01 +0000167 virtual ~out_of_range() _NOEXCEPT;
Eric Fiselierc6e689b2019-03-06 20:31:57 +0000168#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +0000169};
170
171class _LIBCPP_EXCEPTION_ABI range_error
172 : public runtime_error
173{
174public:
175 _LIBCPP_INLINE_VISIBILITY explicit range_error(const string& __s) : runtime_error(__s) {}
176 _LIBCPP_INLINE_VISIBILITY explicit range_error(const char* __s) : runtime_error(__s) {}
177
Eric Fiselierc6e689b2019-03-06 20:31:57 +0000178#ifndef _LIBCPP_ABI_VCRUNTIME
Howard Hinnant1f098bc2011-05-26 19:48:01 +0000179 virtual ~range_error() _NOEXCEPT;
Eric Fiselierc6e689b2019-03-06 20:31:57 +0000180#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +0000181};
182
183class _LIBCPP_EXCEPTION_ABI overflow_error
184 : public runtime_error
185{
186public:
187 _LIBCPP_INLINE_VISIBILITY explicit overflow_error(const string& __s) : runtime_error(__s) {}
188 _LIBCPP_INLINE_VISIBILITY explicit overflow_error(const char* __s) : runtime_error(__s) {}
189
Eric Fiselierc6e689b2019-03-06 20:31:57 +0000190#ifndef _LIBCPP_ABI_VCRUNTIME
Howard Hinnant1f098bc2011-05-26 19:48:01 +0000191 virtual ~overflow_error() _NOEXCEPT;
Eric Fiselierc6e689b2019-03-06 20:31:57 +0000192#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +0000193};
194
195class _LIBCPP_EXCEPTION_ABI underflow_error
196 : public runtime_error
197{
198public:
199 _LIBCPP_INLINE_VISIBILITY explicit underflow_error(const string& __s) : runtime_error(__s) {}
200 _LIBCPP_INLINE_VISIBILITY explicit underflow_error(const char* __s) : runtime_error(__s) {}
201
Eric Fiselierc6e689b2019-03-06 20:31:57 +0000202#ifndef _LIBCPP_ABI_VCRUNTIME
Howard Hinnant1f098bc2011-05-26 19:48:01 +0000203 virtual ~underflow_error() _NOEXCEPT;
Eric Fiselierc6e689b2019-03-06 20:31:57 +0000204#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +0000205};
206
Howard Hinnantc51e1022010-05-11 19:42:16 +0000207} // std
208
Marshall Clow8fea1612016-08-25 15:09:01 +0000209_LIBCPP_BEGIN_NAMESPACE_STD
210
211// in the dylib
212_LIBCPP_NORETURN _LIBCPP_FUNC_VIS void __throw_runtime_error(const char*);
213
Louis Dionne16fe2952018-07-11 23:14:33 +0000214_LIBCPP_NORETURN inline _LIBCPP_INLINE_VISIBILITY
Marshall Clow8fea1612016-08-25 15:09:01 +0000215void __throw_logic_error(const char*__msg)
216{
217#ifndef _LIBCPP_NO_EXCEPTIONS
218 throw logic_error(__msg);
219#else
Eric Fiselier6003c772016-12-23 23:37:52 +0000220 ((void)__msg);
Louis Dionne44bcff92018-08-03 22:36:53 +0000221 _VSTD::abort();
Marshall Clow8fea1612016-08-25 15:09:01 +0000222#endif
223}
224
Louis Dionne16fe2952018-07-11 23:14:33 +0000225_LIBCPP_NORETURN inline _LIBCPP_INLINE_VISIBILITY
Marshall Clow8fea1612016-08-25 15:09:01 +0000226void __throw_domain_error(const char*__msg)
227{
228#ifndef _LIBCPP_NO_EXCEPTIONS
229 throw domain_error(__msg);
230#else
Eric Fiselier6003c772016-12-23 23:37:52 +0000231 ((void)__msg);
Louis Dionne44bcff92018-08-03 22:36:53 +0000232 _VSTD::abort();
Marshall Clow8fea1612016-08-25 15:09:01 +0000233#endif
234}
235
Louis Dionne16fe2952018-07-11 23:14:33 +0000236_LIBCPP_NORETURN inline _LIBCPP_INLINE_VISIBILITY
Marshall Clow8fea1612016-08-25 15:09:01 +0000237void __throw_invalid_argument(const char*__msg)
238{
239#ifndef _LIBCPP_NO_EXCEPTIONS
240 throw invalid_argument(__msg);
241#else
Eric Fiselier6003c772016-12-23 23:37:52 +0000242 ((void)__msg);
Louis Dionne44bcff92018-08-03 22:36:53 +0000243 _VSTD::abort();
Marshall Clow8fea1612016-08-25 15:09:01 +0000244#endif
245}
246
Louis Dionne16fe2952018-07-11 23:14:33 +0000247_LIBCPP_NORETURN inline _LIBCPP_INLINE_VISIBILITY
Marshall Clow8fea1612016-08-25 15:09:01 +0000248void __throw_length_error(const char*__msg)
249{
250#ifndef _LIBCPP_NO_EXCEPTIONS
251 throw length_error(__msg);
252#else
Eric Fiselier6003c772016-12-23 23:37:52 +0000253 ((void)__msg);
Louis Dionne44bcff92018-08-03 22:36:53 +0000254 _VSTD::abort();
Marshall Clow8fea1612016-08-25 15:09:01 +0000255#endif
256}
257
Louis Dionne16fe2952018-07-11 23:14:33 +0000258_LIBCPP_NORETURN inline _LIBCPP_INLINE_VISIBILITY
Marshall Clow8fea1612016-08-25 15:09:01 +0000259void __throw_out_of_range(const char*__msg)
260{
261#ifndef _LIBCPP_NO_EXCEPTIONS
262 throw out_of_range(__msg);
263#else
Eric Fiselier6003c772016-12-23 23:37:52 +0000264 ((void)__msg);
Louis Dionne44bcff92018-08-03 22:36:53 +0000265 _VSTD::abort();
Marshall Clow8fea1612016-08-25 15:09:01 +0000266#endif
267}
268
Louis Dionne16fe2952018-07-11 23:14:33 +0000269_LIBCPP_NORETURN inline _LIBCPP_INLINE_VISIBILITY
Marshall Clow8fea1612016-08-25 15:09:01 +0000270void __throw_range_error(const char*__msg)
271{
272#ifndef _LIBCPP_NO_EXCEPTIONS
273 throw range_error(__msg);
274#else
Eric Fiselier6003c772016-12-23 23:37:52 +0000275 ((void)__msg);
Louis Dionne44bcff92018-08-03 22:36:53 +0000276 _VSTD::abort();
Marshall Clow8fea1612016-08-25 15:09:01 +0000277#endif
278}
279
Louis Dionne16fe2952018-07-11 23:14:33 +0000280_LIBCPP_NORETURN inline _LIBCPP_INLINE_VISIBILITY
Marshall Clow8fea1612016-08-25 15:09:01 +0000281void __throw_overflow_error(const char*__msg)
282{
283#ifndef _LIBCPP_NO_EXCEPTIONS
284 throw overflow_error(__msg);
285#else
Eric Fiselier6003c772016-12-23 23:37:52 +0000286 ((void)__msg);
287 _VSTD::abort();
Marshall Clow8fea1612016-08-25 15:09:01 +0000288#endif
289}
290
Louis Dionne16fe2952018-07-11 23:14:33 +0000291_LIBCPP_NORETURN inline _LIBCPP_INLINE_VISIBILITY
Marshall Clow8fea1612016-08-25 15:09:01 +0000292void __throw_underflow_error(const char*__msg)
293{
294#ifndef _LIBCPP_NO_EXCEPTIONS
295 throw underflow_error(__msg);
296#else
Eric Fiselier6003c772016-12-23 23:37:52 +0000297 ((void)__msg);
298 _VSTD::abort();
Marshall Clow8fea1612016-08-25 15:09:01 +0000299#endif
300}
301
302_LIBCPP_END_NAMESPACE_STD
303
Howard Hinnantc51e1022010-05-11 19:42:16 +0000304#endif // _LIBCPP_STDEXCEPT