10b57cec5SDimitry Andric// -*- C++ -*-
2349cc55cSDimitry Andric//===----------------------------------------------------------------------===//
30b57cec5SDimitry Andric//
40b57cec5SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
50b57cec5SDimitry Andric// See https://llvm.org/LICENSE.txt for license information.
60b57cec5SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
70b57cec5SDimitry Andric//
80b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
90b57cec5SDimitry Andric
100b57cec5SDimitry Andric#ifndef _LIBCPP_STDEXCEPT
110b57cec5SDimitry Andric#define _LIBCPP_STDEXCEPT
120b57cec5SDimitry Andric
130b57cec5SDimitry Andric/*
140b57cec5SDimitry Andric    stdexcept synopsis
150b57cec5SDimitry Andric
160b57cec5SDimitry Andricnamespace std
170b57cec5SDimitry Andric{
180b57cec5SDimitry Andric
190b57cec5SDimitry Andricclass logic_error;
200b57cec5SDimitry Andric    class domain_error;
210b57cec5SDimitry Andric    class invalid_argument;
220b57cec5SDimitry Andric    class length_error;
230b57cec5SDimitry Andric    class out_of_range;
240b57cec5SDimitry Andricclass runtime_error;
250b57cec5SDimitry Andric    class range_error;
260b57cec5SDimitry Andric    class overflow_error;
270b57cec5SDimitry Andric    class underflow_error;
280b57cec5SDimitry Andric
290b57cec5SDimitry Andricfor each class xxx_error:
300b57cec5SDimitry Andric
310b57cec5SDimitry Andricclass xxx_error : public exception // at least indirectly
320b57cec5SDimitry Andric{
330b57cec5SDimitry Andricpublic:
340b57cec5SDimitry Andric    explicit xxx_error(const string& what_arg);
350b57cec5SDimitry Andric    explicit xxx_error(const char*   what_arg);
360b57cec5SDimitry Andric
370b57cec5SDimitry Andric    virtual const char* what() const noexcept // returns what_arg
380b57cec5SDimitry Andric};
390b57cec5SDimitry Andric
400b57cec5SDimitry Andric}  // std
410b57cec5SDimitry Andric
420b57cec5SDimitry Andric*/
430b57cec5SDimitry Andric
4481ad6265SDimitry Andric#include <__assert> // all public C++ headers provide the assertion handler
450b57cec5SDimitry Andric#include <__config>
46fe013be4SDimitry Andric#include <__exception/exception.h>
47c9157d92SDimitry Andric#include <__fwd/string.h>
48fe013be4SDimitry Andric#include <__verbose_abort>
490b57cec5SDimitry Andric
500b57cec5SDimitry Andric#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
510b57cec5SDimitry Andric#  pragma GCC system_header
520b57cec5SDimitry Andric#endif
530b57cec5SDimitry Andric
540b57cec5SDimitry Andric_LIBCPP_BEGIN_NAMESPACE_STD
550b57cec5SDimitry Andric
560b57cec5SDimitry Andric#ifndef _LIBCPP_ABI_VCRUNTIME
57*e710425bSDimitry Andricclass _LIBCPP_HIDDEN __libcpp_refstring {
580b57cec5SDimitry Andric  const char* __imp_;
590b57cec5SDimitry Andric
600b57cec5SDimitry Andric  bool __uses_refcount() const;
61*e710425bSDimitry Andric
620b57cec5SDimitry Andricpublic:
630b57cec5SDimitry Andric  explicit __libcpp_refstring(const char* __msg);
640b57cec5SDimitry Andric  __libcpp_refstring(const __libcpp_refstring& __s) _NOEXCEPT;
650b57cec5SDimitry Andric  __libcpp_refstring& operator=(const __libcpp_refstring& __s) _NOEXCEPT;
660b57cec5SDimitry Andric  ~__libcpp_refstring();
670b57cec5SDimitry Andric
68fe013be4SDimitry Andric  _LIBCPP_HIDE_FROM_ABI const char* c_str() const _NOEXCEPT { return __imp_; }
690b57cec5SDimitry Andric};
700b57cec5SDimitry Andric#endif // !_LIBCPP_ABI_VCRUNTIME
710b57cec5SDimitry Andric
720b57cec5SDimitry Andric_LIBCPP_END_NAMESPACE_STD
730b57cec5SDimitry Andric
740b57cec5SDimitry Andricnamespace std // purposefully not using versioning namespace
750b57cec5SDimitry Andric{
760b57cec5SDimitry Andric
77*e710425bSDimitry Andricclass _LIBCPP_EXPORTED_FROM_ABI logic_error : public exception {
780b57cec5SDimitry Andric#ifndef _LIBCPP_ABI_VCRUNTIME
79*e710425bSDimitry Andric
800b57cec5SDimitry Andricprivate:
81c9157d92SDimitry Andric  std::__libcpp_refstring __imp_;
82*e710425bSDimitry Andric
830b57cec5SDimitry Andricpublic:
840b57cec5SDimitry Andric  explicit logic_error(const string&);
850b57cec5SDimitry Andric  explicit logic_error(const char*);
860b57cec5SDimitry Andric
870b57cec5SDimitry Andric  logic_error(const logic_error&) _NOEXCEPT;
880b57cec5SDimitry Andric  logic_error& operator=(const logic_error&) _NOEXCEPT;
890b57cec5SDimitry Andric
90bdd1243dSDimitry Andric  ~logic_error() _NOEXCEPT override;
910b57cec5SDimitry Andric
92bdd1243dSDimitry Andric  const char* what() const _NOEXCEPT override;
930b57cec5SDimitry Andric#else
94*e710425bSDimitry Andric
950b57cec5SDimitry Andricpublic:
96c9157d92SDimitry Andric  explicit logic_error(const std::string&); // Symbol uses versioned std::string
97c9157d92SDimitry Andric  _LIBCPP_HIDE_FROM_ABI explicit logic_error(const char* __s) : exception(__s) {}
980b57cec5SDimitry Andric#endif
990b57cec5SDimitry Andric};
1000b57cec5SDimitry Andric
101*e710425bSDimitry Andricclass _LIBCPP_EXPORTED_FROM_ABI runtime_error : public exception {
1020b57cec5SDimitry Andric#ifndef _LIBCPP_ABI_VCRUNTIME
103*e710425bSDimitry Andric
1040b57cec5SDimitry Andricprivate:
105c9157d92SDimitry Andric  std::__libcpp_refstring __imp_;
106*e710425bSDimitry Andric
1070b57cec5SDimitry Andricpublic:
1080b57cec5SDimitry Andric  explicit runtime_error(const string&);
1090b57cec5SDimitry Andric  explicit runtime_error(const char*);
1100b57cec5SDimitry Andric
1110b57cec5SDimitry Andric  runtime_error(const runtime_error&) _NOEXCEPT;
1120b57cec5SDimitry Andric  runtime_error& operator=(const runtime_error&) _NOEXCEPT;
1130b57cec5SDimitry Andric
114bdd1243dSDimitry Andric  ~runtime_error() _NOEXCEPT override;
1150b57cec5SDimitry Andric
116bdd1243dSDimitry Andric  const char* what() const _NOEXCEPT override;
1170b57cec5SDimitry Andric#else
118*e710425bSDimitry Andric
1190b57cec5SDimitry Andricpublic:
120c9157d92SDimitry Andric  explicit runtime_error(const std::string&); // Symbol uses versioned std::string
121c9157d92SDimitry Andric  _LIBCPP_HIDE_FROM_ABI explicit runtime_error(const char* __s) : exception(__s) {}
1220b57cec5SDimitry Andric#endif // _LIBCPP_ABI_VCRUNTIME
1230b57cec5SDimitry Andric};
1240b57cec5SDimitry Andric
125*e710425bSDimitry Andricclass _LIBCPP_EXPORTED_FROM_ABI domain_error : public logic_error {
1260b57cec5SDimitry Andricpublic:
127c9157d92SDimitry Andric  _LIBCPP_HIDE_FROM_ABI explicit domain_error(const string& __s) : logic_error(__s) {}
128c9157d92SDimitry Andric  _LIBCPP_HIDE_FROM_ABI explicit domain_error(const char* __s) : logic_error(__s) {}
1290b57cec5SDimitry Andric
1300b57cec5SDimitry Andric#ifndef _LIBCPP_ABI_VCRUNTIME
131fe013be4SDimitry Andric  _LIBCPP_HIDE_FROM_ABI domain_error(const domain_error&) _NOEXCEPT            = default;
132c9157d92SDimitry Andric  _LIBCPP_HIDE_FROM_ABI domain_error& operator=(const domain_error&) _NOEXCEPT = default;
133bdd1243dSDimitry Andric  ~domain_error() _NOEXCEPT override;
1340b57cec5SDimitry Andric#endif
1350b57cec5SDimitry Andric};
1360b57cec5SDimitry Andric
137*e710425bSDimitry Andricclass _LIBCPP_EXPORTED_FROM_ABI invalid_argument : public logic_error {
1380b57cec5SDimitry Andricpublic:
139c9157d92SDimitry Andric  _LIBCPP_HIDE_FROM_ABI explicit invalid_argument(const string& __s) : logic_error(__s) {}
140c9157d92SDimitry Andric  _LIBCPP_HIDE_FROM_ABI explicit invalid_argument(const char* __s) : logic_error(__s) {}
1410b57cec5SDimitry Andric
1420b57cec5SDimitry Andric#ifndef _LIBCPP_ABI_VCRUNTIME
143fe013be4SDimitry Andric  _LIBCPP_HIDE_FROM_ABI invalid_argument(const invalid_argument&) _NOEXCEPT            = default;
144c9157d92SDimitry Andric  _LIBCPP_HIDE_FROM_ABI invalid_argument& operator=(const invalid_argument&) _NOEXCEPT = default;
145bdd1243dSDimitry Andric  ~invalid_argument() _NOEXCEPT override;
1460b57cec5SDimitry Andric#endif
1470b57cec5SDimitry Andric};
1480b57cec5SDimitry Andric
149*e710425bSDimitry Andricclass _LIBCPP_EXPORTED_FROM_ABI length_error : public logic_error {
1500b57cec5SDimitry Andricpublic:
151c9157d92SDimitry Andric  _LIBCPP_HIDE_FROM_ABI explicit length_error(const string& __s) : logic_error(__s) {}
152c9157d92SDimitry Andric  _LIBCPP_HIDE_FROM_ABI explicit length_error(const char* __s) : logic_error(__s) {}
1530b57cec5SDimitry Andric#ifndef _LIBCPP_ABI_VCRUNTIME
154fe013be4SDimitry Andric  _LIBCPP_HIDE_FROM_ABI length_error(const length_error&) _NOEXCEPT            = default;
155c9157d92SDimitry Andric  _LIBCPP_HIDE_FROM_ABI length_error& operator=(const length_error&) _NOEXCEPT = default;
156bdd1243dSDimitry Andric  ~length_error() _NOEXCEPT override;
1570b57cec5SDimitry Andric#endif
1580b57cec5SDimitry Andric};
1590b57cec5SDimitry Andric
160*e710425bSDimitry Andricclass _LIBCPP_EXPORTED_FROM_ABI out_of_range : public logic_error {
1610b57cec5SDimitry Andricpublic:
162c9157d92SDimitry Andric  _LIBCPP_HIDE_FROM_ABI explicit out_of_range(const string& __s) : logic_error(__s) {}
163c9157d92SDimitry Andric  _LIBCPP_HIDE_FROM_ABI explicit out_of_range(const char* __s) : logic_error(__s) {}
1640b57cec5SDimitry Andric
1650b57cec5SDimitry Andric#ifndef _LIBCPP_ABI_VCRUNTIME
166fe013be4SDimitry Andric  _LIBCPP_HIDE_FROM_ABI out_of_range(const out_of_range&) _NOEXCEPT            = default;
167c9157d92SDimitry Andric  _LIBCPP_HIDE_FROM_ABI out_of_range& operator=(const out_of_range&) _NOEXCEPT = default;
168bdd1243dSDimitry Andric  ~out_of_range() _NOEXCEPT override;
1690b57cec5SDimitry Andric#endif
1700b57cec5SDimitry Andric};
1710b57cec5SDimitry Andric
172*e710425bSDimitry Andricclass _LIBCPP_EXPORTED_FROM_ABI range_error : public runtime_error {
1730b57cec5SDimitry Andricpublic:
174c9157d92SDimitry Andric  _LIBCPP_HIDE_FROM_ABI explicit range_error(const string& __s) : runtime_error(__s) {}
175c9157d92SDimitry Andric  _LIBCPP_HIDE_FROM_ABI explicit range_error(const char* __s) : runtime_error(__s) {}
1760b57cec5SDimitry Andric
1770b57cec5SDimitry Andric#ifndef _LIBCPP_ABI_VCRUNTIME
178fe013be4SDimitry Andric  _LIBCPP_HIDE_FROM_ABI range_error(const range_error&) _NOEXCEPT            = default;
179c9157d92SDimitry Andric  _LIBCPP_HIDE_FROM_ABI range_error& operator=(const range_error&) _NOEXCEPT = default;
180bdd1243dSDimitry Andric  ~range_error() _NOEXCEPT override;
1810b57cec5SDimitry Andric#endif
1820b57cec5SDimitry Andric};
1830b57cec5SDimitry Andric
184*e710425bSDimitry Andricclass _LIBCPP_EXPORTED_FROM_ABI overflow_error : public runtime_error {
1850b57cec5SDimitry Andricpublic:
186c9157d92SDimitry Andric  _LIBCPP_HIDE_FROM_ABI explicit overflow_error(const string& __s) : runtime_error(__s) {}
187c9157d92SDimitry Andric  _LIBCPP_HIDE_FROM_ABI explicit overflow_error(const char* __s) : runtime_error(__s) {}
1880b57cec5SDimitry Andric
1890b57cec5SDimitry Andric#ifndef _LIBCPP_ABI_VCRUNTIME
190fe013be4SDimitry Andric  _LIBCPP_HIDE_FROM_ABI overflow_error(const overflow_error&) _NOEXCEPT            = default;
191c9157d92SDimitry Andric  _LIBCPP_HIDE_FROM_ABI overflow_error& operator=(const overflow_error&) _NOEXCEPT = default;
192bdd1243dSDimitry Andric  ~overflow_error() _NOEXCEPT override;
1930b57cec5SDimitry Andric#endif
1940b57cec5SDimitry Andric};
1950b57cec5SDimitry Andric
196*e710425bSDimitry Andricclass _LIBCPP_EXPORTED_FROM_ABI underflow_error : public runtime_error {
1970b57cec5SDimitry Andricpublic:
198c9157d92SDimitry Andric  _LIBCPP_HIDE_FROM_ABI explicit underflow_error(const string& __s) : runtime_error(__s) {}
199c9157d92SDimitry Andric  _LIBCPP_HIDE_FROM_ABI explicit underflow_error(const char* __s) : runtime_error(__s) {}
2000b57cec5SDimitry Andric
2010b57cec5SDimitry Andric#ifndef _LIBCPP_ABI_VCRUNTIME
202fe013be4SDimitry Andric  _LIBCPP_HIDE_FROM_ABI underflow_error(const underflow_error&) _NOEXCEPT            = default;
203c9157d92SDimitry Andric  _LIBCPP_HIDE_FROM_ABI underflow_error& operator=(const underflow_error&) _NOEXCEPT = default;
204bdd1243dSDimitry Andric  ~underflow_error() _NOEXCEPT override;
2050b57cec5SDimitry Andric#endif
2060b57cec5SDimitry Andric};
2070b57cec5SDimitry Andric
2080eae32dcSDimitry Andric} // namespace std
2090b57cec5SDimitry Andric
2100b57cec5SDimitry Andric_LIBCPP_BEGIN_NAMESPACE_STD
2110b57cec5SDimitry Andric
2120b57cec5SDimitry Andric// in the dylib
213fe013be4SDimitry Andric_LIBCPP_NORETURN _LIBCPP_EXPORTED_FROM_ABI void __throw_runtime_error(const char*);
2140b57cec5SDimitry Andric
215*e710425bSDimitry Andric_LIBCPP_NORETURN inline _LIBCPP_HIDE_FROM_ABI void __throw_logic_error(const char* __msg) {
216fe013be4SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
2170b57cec5SDimitry Andric  throw logic_error(__msg);
2180b57cec5SDimitry Andric#else
219fe013be4SDimitry Andric  _LIBCPP_VERBOSE_ABORT("logic_error was thrown in -fno-exceptions mode with message \"%s\"", __msg);
2200b57cec5SDimitry Andric#endif
2210b57cec5SDimitry Andric}
2220b57cec5SDimitry Andric
223*e710425bSDimitry Andric_LIBCPP_NORETURN inline _LIBCPP_HIDE_FROM_ABI void __throw_domain_error(const char* __msg) {
224fe013be4SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
2250b57cec5SDimitry Andric  throw domain_error(__msg);
2260b57cec5SDimitry Andric#else
227fe013be4SDimitry Andric  _LIBCPP_VERBOSE_ABORT("domain_error was thrown in -fno-exceptions mode with message \"%s\"", __msg);
2280b57cec5SDimitry Andric#endif
2290b57cec5SDimitry Andric}
2300b57cec5SDimitry Andric
231*e710425bSDimitry Andric_LIBCPP_NORETURN inline _LIBCPP_HIDE_FROM_ABI void __throw_invalid_argument(const char* __msg) {
232fe013be4SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
2330b57cec5SDimitry Andric  throw invalid_argument(__msg);
2340b57cec5SDimitry Andric#else
235fe013be4SDimitry Andric  _LIBCPP_VERBOSE_ABORT("invalid_argument was thrown in -fno-exceptions mode with message \"%s\"", __msg);
2360b57cec5SDimitry Andric#endif
2370b57cec5SDimitry Andric}
2380b57cec5SDimitry Andric
239*e710425bSDimitry Andric_LIBCPP_NORETURN inline _LIBCPP_HIDE_FROM_ABI void __throw_length_error(const char* __msg) {
240fe013be4SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
2410b57cec5SDimitry Andric  throw length_error(__msg);
2420b57cec5SDimitry Andric#else
243fe013be4SDimitry Andric  _LIBCPP_VERBOSE_ABORT("length_error was thrown in -fno-exceptions mode with message \"%s\"", __msg);
2440b57cec5SDimitry Andric#endif
2450b57cec5SDimitry Andric}
2460b57cec5SDimitry Andric
247*e710425bSDimitry Andric_LIBCPP_NORETURN inline _LIBCPP_HIDE_FROM_ABI void __throw_out_of_range(const char* __msg) {
248fe013be4SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
2490b57cec5SDimitry Andric  throw out_of_range(__msg);
2500b57cec5SDimitry Andric#else
251fe013be4SDimitry Andric  _LIBCPP_VERBOSE_ABORT("out_of_range was thrown in -fno-exceptions mode with message \"%s\"", __msg);
2520b57cec5SDimitry Andric#endif
2530b57cec5SDimitry Andric}
2540b57cec5SDimitry Andric
255*e710425bSDimitry Andric_LIBCPP_NORETURN inline _LIBCPP_HIDE_FROM_ABI void __throw_range_error(const char* __msg) {
256fe013be4SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
2570b57cec5SDimitry Andric  throw range_error(__msg);
2580b57cec5SDimitry Andric#else
259fe013be4SDimitry Andric  _LIBCPP_VERBOSE_ABORT("range_error was thrown in -fno-exceptions mode with message \"%s\"", __msg);
2600b57cec5SDimitry Andric#endif
2610b57cec5SDimitry Andric}
2620b57cec5SDimitry Andric
263*e710425bSDimitry Andric_LIBCPP_NORETURN inline _LIBCPP_HIDE_FROM_ABI void __throw_overflow_error(const char* __msg) {
264fe013be4SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
2650b57cec5SDimitry Andric  throw overflow_error(__msg);
2660b57cec5SDimitry Andric#else
267fe013be4SDimitry Andric  _LIBCPP_VERBOSE_ABORT("overflow_error was thrown in -fno-exceptions mode with message \"%s\"", __msg);
2680b57cec5SDimitry Andric#endif
2690b57cec5SDimitry Andric}
2700b57cec5SDimitry Andric
271*e710425bSDimitry Andric_LIBCPP_NORETURN inline _LIBCPP_HIDE_FROM_ABI void __throw_underflow_error(const char* __msg) {
272fe013be4SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
2730b57cec5SDimitry Andric  throw underflow_error(__msg);
2740b57cec5SDimitry Andric#else
275fe013be4SDimitry Andric  _LIBCPP_VERBOSE_ABORT("underflow_error was thrown in -fno-exceptions mode with message \"%s\"", __msg);
2760b57cec5SDimitry Andric#endif
2770b57cec5SDimitry Andric}
2780b57cec5SDimitry Andric
2790b57cec5SDimitry Andric_LIBCPP_END_NAMESPACE_STD
2800b57cec5SDimitry Andric
281fe013be4SDimitry Andric#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
282fe013be4SDimitry Andric#  include <cstdlib>
283fe013be4SDimitry Andric#  include <exception>
284c9157d92SDimitry Andric#  include <iosfwd>
285fe013be4SDimitry Andric#endif
286fe013be4SDimitry Andric
2870b57cec5SDimitry Andric#endif // _LIBCPP_STDEXCEPT
288