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