xref: /freebsd/contrib/llvm-project/libcxx/include/stdexcept (revision cb14a3fe5122c879eae1fb480ed7ce82a699ddb6)
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>
4606c3fb27SDimitry Andric#include <__exception/exception.h>
475f757f3fSDimitry Andric#include <__fwd/string.h>
4806c3fb27SDimitry 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*cb14a3feSDimitry Andricclass _LIBCPP_HIDDEN __libcpp_refstring {
580b57cec5SDimitry Andric  const char* __imp_;
590b57cec5SDimitry Andric
600b57cec5SDimitry Andric  bool __uses_refcount() const;
61*cb14a3feSDimitry 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
6806c3fb27SDimitry 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*cb14a3feSDimitry Andricclass _LIBCPP_EXPORTED_FROM_ABI logic_error : public exception {
780b57cec5SDimitry Andric#ifndef _LIBCPP_ABI_VCRUNTIME
79*cb14a3feSDimitry Andric
800b57cec5SDimitry Andricprivate:
815f757f3fSDimitry Andric  std::__libcpp_refstring __imp_;
82*cb14a3feSDimitry 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*cb14a3feSDimitry Andric
950b57cec5SDimitry Andricpublic:
965f757f3fSDimitry Andric  explicit logic_error(const std::string&); // Symbol uses versioned std::string
975f757f3fSDimitry Andric  _LIBCPP_HIDE_FROM_ABI explicit logic_error(const char* __s) : exception(__s) {}
980b57cec5SDimitry Andric#endif
990b57cec5SDimitry Andric};
1000b57cec5SDimitry Andric
101*cb14a3feSDimitry Andricclass _LIBCPP_EXPORTED_FROM_ABI runtime_error : public exception {
1020b57cec5SDimitry Andric#ifndef _LIBCPP_ABI_VCRUNTIME
103*cb14a3feSDimitry Andric
1040b57cec5SDimitry Andricprivate:
1055f757f3fSDimitry Andric  std::__libcpp_refstring __imp_;
106*cb14a3feSDimitry 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*cb14a3feSDimitry Andric
1190b57cec5SDimitry Andricpublic:
1205f757f3fSDimitry Andric  explicit runtime_error(const std::string&); // Symbol uses versioned std::string
1215f757f3fSDimitry Andric  _LIBCPP_HIDE_FROM_ABI explicit runtime_error(const char* __s) : exception(__s) {}
1220b57cec5SDimitry Andric#endif // _LIBCPP_ABI_VCRUNTIME
1230b57cec5SDimitry Andric};
1240b57cec5SDimitry Andric
125*cb14a3feSDimitry Andricclass _LIBCPP_EXPORTED_FROM_ABI domain_error : public logic_error {
1260b57cec5SDimitry Andricpublic:
1275f757f3fSDimitry Andric  _LIBCPP_HIDE_FROM_ABI explicit domain_error(const string& __s) : logic_error(__s) {}
1285f757f3fSDimitry Andric  _LIBCPP_HIDE_FROM_ABI explicit domain_error(const char* __s) : logic_error(__s) {}
1290b57cec5SDimitry Andric
1300b57cec5SDimitry Andric#ifndef _LIBCPP_ABI_VCRUNTIME
13106c3fb27SDimitry Andric  _LIBCPP_HIDE_FROM_ABI domain_error(const domain_error&) _NOEXCEPT            = default;
1325f757f3fSDimitry 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*cb14a3feSDimitry Andricclass _LIBCPP_EXPORTED_FROM_ABI invalid_argument : public logic_error {
1380b57cec5SDimitry Andricpublic:
1395f757f3fSDimitry Andric  _LIBCPP_HIDE_FROM_ABI explicit invalid_argument(const string& __s) : logic_error(__s) {}
1405f757f3fSDimitry Andric  _LIBCPP_HIDE_FROM_ABI explicit invalid_argument(const char* __s) : logic_error(__s) {}
1410b57cec5SDimitry Andric
1420b57cec5SDimitry Andric#ifndef _LIBCPP_ABI_VCRUNTIME
14306c3fb27SDimitry Andric  _LIBCPP_HIDE_FROM_ABI invalid_argument(const invalid_argument&) _NOEXCEPT            = default;
1445f757f3fSDimitry 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*cb14a3feSDimitry Andricclass _LIBCPP_EXPORTED_FROM_ABI length_error : public logic_error {
1500b57cec5SDimitry Andricpublic:
1515f757f3fSDimitry Andric  _LIBCPP_HIDE_FROM_ABI explicit length_error(const string& __s) : logic_error(__s) {}
1525f757f3fSDimitry Andric  _LIBCPP_HIDE_FROM_ABI explicit length_error(const char* __s) : logic_error(__s) {}
1530b57cec5SDimitry Andric#ifndef _LIBCPP_ABI_VCRUNTIME
15406c3fb27SDimitry Andric  _LIBCPP_HIDE_FROM_ABI length_error(const length_error&) _NOEXCEPT            = default;
1555f757f3fSDimitry 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*cb14a3feSDimitry Andricclass _LIBCPP_EXPORTED_FROM_ABI out_of_range : public logic_error {
1610b57cec5SDimitry Andricpublic:
1625f757f3fSDimitry Andric  _LIBCPP_HIDE_FROM_ABI explicit out_of_range(const string& __s) : logic_error(__s) {}
1635f757f3fSDimitry Andric  _LIBCPP_HIDE_FROM_ABI explicit out_of_range(const char* __s) : logic_error(__s) {}
1640b57cec5SDimitry Andric
1650b57cec5SDimitry Andric#ifndef _LIBCPP_ABI_VCRUNTIME
16606c3fb27SDimitry Andric  _LIBCPP_HIDE_FROM_ABI out_of_range(const out_of_range&) _NOEXCEPT            = default;
1675f757f3fSDimitry 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*cb14a3feSDimitry Andricclass _LIBCPP_EXPORTED_FROM_ABI range_error : public runtime_error {
1730b57cec5SDimitry Andricpublic:
1745f757f3fSDimitry Andric  _LIBCPP_HIDE_FROM_ABI explicit range_error(const string& __s) : runtime_error(__s) {}
1755f757f3fSDimitry Andric  _LIBCPP_HIDE_FROM_ABI explicit range_error(const char* __s) : runtime_error(__s) {}
1760b57cec5SDimitry Andric
1770b57cec5SDimitry Andric#ifndef _LIBCPP_ABI_VCRUNTIME
17806c3fb27SDimitry Andric  _LIBCPP_HIDE_FROM_ABI range_error(const range_error&) _NOEXCEPT            = default;
1795f757f3fSDimitry 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*cb14a3feSDimitry Andricclass _LIBCPP_EXPORTED_FROM_ABI overflow_error : public runtime_error {
1850b57cec5SDimitry Andricpublic:
1865f757f3fSDimitry Andric  _LIBCPP_HIDE_FROM_ABI explicit overflow_error(const string& __s) : runtime_error(__s) {}
1875f757f3fSDimitry Andric  _LIBCPP_HIDE_FROM_ABI explicit overflow_error(const char* __s) : runtime_error(__s) {}
1880b57cec5SDimitry Andric
1890b57cec5SDimitry Andric#ifndef _LIBCPP_ABI_VCRUNTIME
19006c3fb27SDimitry Andric  _LIBCPP_HIDE_FROM_ABI overflow_error(const overflow_error&) _NOEXCEPT            = default;
1915f757f3fSDimitry 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*cb14a3feSDimitry Andricclass _LIBCPP_EXPORTED_FROM_ABI underflow_error : public runtime_error {
1970b57cec5SDimitry Andricpublic:
1985f757f3fSDimitry Andric  _LIBCPP_HIDE_FROM_ABI explicit underflow_error(const string& __s) : runtime_error(__s) {}
1995f757f3fSDimitry Andric  _LIBCPP_HIDE_FROM_ABI explicit underflow_error(const char* __s) : runtime_error(__s) {}
2000b57cec5SDimitry Andric
2010b57cec5SDimitry Andric#ifndef _LIBCPP_ABI_VCRUNTIME
20206c3fb27SDimitry Andric  _LIBCPP_HIDE_FROM_ABI underflow_error(const underflow_error&) _NOEXCEPT            = default;
2035f757f3fSDimitry 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
21306c3fb27SDimitry Andric_LIBCPP_NORETURN _LIBCPP_EXPORTED_FROM_ABI void __throw_runtime_error(const char*);
2140b57cec5SDimitry Andric
215*cb14a3feSDimitry Andric_LIBCPP_NORETURN inline _LIBCPP_HIDE_FROM_ABI void __throw_logic_error(const char* __msg) {
21606c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
2170b57cec5SDimitry Andric  throw logic_error(__msg);
2180b57cec5SDimitry Andric#else
21906c3fb27SDimitry Andric  _LIBCPP_VERBOSE_ABORT("logic_error was thrown in -fno-exceptions mode with message \"%s\"", __msg);
2200b57cec5SDimitry Andric#endif
2210b57cec5SDimitry Andric}
2220b57cec5SDimitry Andric
223*cb14a3feSDimitry Andric_LIBCPP_NORETURN inline _LIBCPP_HIDE_FROM_ABI void __throw_domain_error(const char* __msg) {
22406c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
2250b57cec5SDimitry Andric  throw domain_error(__msg);
2260b57cec5SDimitry Andric#else
22706c3fb27SDimitry Andric  _LIBCPP_VERBOSE_ABORT("domain_error was thrown in -fno-exceptions mode with message \"%s\"", __msg);
2280b57cec5SDimitry Andric#endif
2290b57cec5SDimitry Andric}
2300b57cec5SDimitry Andric
231*cb14a3feSDimitry Andric_LIBCPP_NORETURN inline _LIBCPP_HIDE_FROM_ABI void __throw_invalid_argument(const char* __msg) {
23206c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
2330b57cec5SDimitry Andric  throw invalid_argument(__msg);
2340b57cec5SDimitry Andric#else
23506c3fb27SDimitry Andric  _LIBCPP_VERBOSE_ABORT("invalid_argument was thrown in -fno-exceptions mode with message \"%s\"", __msg);
2360b57cec5SDimitry Andric#endif
2370b57cec5SDimitry Andric}
2380b57cec5SDimitry Andric
239*cb14a3feSDimitry Andric_LIBCPP_NORETURN inline _LIBCPP_HIDE_FROM_ABI void __throw_length_error(const char* __msg) {
24006c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
2410b57cec5SDimitry Andric  throw length_error(__msg);
2420b57cec5SDimitry Andric#else
24306c3fb27SDimitry Andric  _LIBCPP_VERBOSE_ABORT("length_error was thrown in -fno-exceptions mode with message \"%s\"", __msg);
2440b57cec5SDimitry Andric#endif
2450b57cec5SDimitry Andric}
2460b57cec5SDimitry Andric
247*cb14a3feSDimitry Andric_LIBCPP_NORETURN inline _LIBCPP_HIDE_FROM_ABI void __throw_out_of_range(const char* __msg) {
24806c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
2490b57cec5SDimitry Andric  throw out_of_range(__msg);
2500b57cec5SDimitry Andric#else
25106c3fb27SDimitry 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*cb14a3feSDimitry Andric_LIBCPP_NORETURN inline _LIBCPP_HIDE_FROM_ABI void __throw_range_error(const char* __msg) {
25606c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
2570b57cec5SDimitry Andric  throw range_error(__msg);
2580b57cec5SDimitry Andric#else
25906c3fb27SDimitry Andric  _LIBCPP_VERBOSE_ABORT("range_error was thrown in -fno-exceptions mode with message \"%s\"", __msg);
2600b57cec5SDimitry Andric#endif
2610b57cec5SDimitry Andric}
2620b57cec5SDimitry Andric
263*cb14a3feSDimitry Andric_LIBCPP_NORETURN inline _LIBCPP_HIDE_FROM_ABI void __throw_overflow_error(const char* __msg) {
26406c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
2650b57cec5SDimitry Andric  throw overflow_error(__msg);
2660b57cec5SDimitry Andric#else
26706c3fb27SDimitry Andric  _LIBCPP_VERBOSE_ABORT("overflow_error was thrown in -fno-exceptions mode with message \"%s\"", __msg);
2680b57cec5SDimitry Andric#endif
2690b57cec5SDimitry Andric}
2700b57cec5SDimitry Andric
271*cb14a3feSDimitry Andric_LIBCPP_NORETURN inline _LIBCPP_HIDE_FROM_ABI void __throw_underflow_error(const char* __msg) {
27206c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
2730b57cec5SDimitry Andric  throw underflow_error(__msg);
2740b57cec5SDimitry Andric#else
27506c3fb27SDimitry 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
28106c3fb27SDimitry Andric#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
28206c3fb27SDimitry Andric#  include <cstdlib>
28306c3fb27SDimitry Andric#  include <exception>
2845f757f3fSDimitry Andric#  include <iosfwd>
28506c3fb27SDimitry Andric#endif
28606c3fb27SDimitry Andric
2870b57cec5SDimitry Andric#endif // _LIBCPP_STDEXCEPT
288