xref: /openbsd-src/gnu/llvm/libcxx/include/stdexcept (revision 4bdff4bed0e3d54e55670334c7d0077db4170f86)
146035553Spatrick// -*- C++ -*-
2*4bdff4beSrobert//===----------------------------------------------------------------------===//
346035553Spatrick//
446035553Spatrick// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
546035553Spatrick// See https://llvm.org/LICENSE.txt for license information.
646035553Spatrick// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
746035553Spatrick//
846035553Spatrick//===----------------------------------------------------------------------===//
946035553Spatrick
1046035553Spatrick#ifndef _LIBCPP_STDEXCEPT
1146035553Spatrick#define _LIBCPP_STDEXCEPT
1246035553Spatrick
1346035553Spatrick/*
1446035553Spatrick    stdexcept synopsis
1546035553Spatrick
1646035553Spatricknamespace std
1746035553Spatrick{
1846035553Spatrick
1946035553Spatrickclass logic_error;
2046035553Spatrick    class domain_error;
2146035553Spatrick    class invalid_argument;
2246035553Spatrick    class length_error;
2346035553Spatrick    class out_of_range;
2446035553Spatrickclass runtime_error;
2546035553Spatrick    class range_error;
2646035553Spatrick    class overflow_error;
2746035553Spatrick    class underflow_error;
2846035553Spatrick
2946035553Spatrickfor each class xxx_error:
3046035553Spatrick
3146035553Spatrickclass xxx_error : public exception // at least indirectly
3246035553Spatrick{
3346035553Spatrickpublic:
3446035553Spatrick    explicit xxx_error(const string& what_arg);
3546035553Spatrick    explicit xxx_error(const char*   what_arg);
3646035553Spatrick
3746035553Spatrick    virtual const char* what() const noexcept // returns what_arg
3846035553Spatrick};
3946035553Spatrick
4046035553Spatrick}  // std
4146035553Spatrick
4246035553Spatrick*/
4346035553Spatrick
44*4bdff4beSrobert#include <__assert> // all public C++ headers provide the assertion handler
4546035553Spatrick#include <__config>
46*4bdff4beSrobert#include <cstdlib>
4746035553Spatrick#include <exception>
4846035553Spatrick#include <iosfwd>  // for string forward decl
4946035553Spatrick
5046035553Spatrick#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
5146035553Spatrick#  pragma GCC system_header
5246035553Spatrick#endif
5346035553Spatrick
5446035553Spatrick_LIBCPP_BEGIN_NAMESPACE_STD
5546035553Spatrick
5646035553Spatrick#ifndef _LIBCPP_ABI_VCRUNTIME
5746035553Spatrickclass _LIBCPP_HIDDEN __libcpp_refstring
5846035553Spatrick{
5946035553Spatrick    const char* __imp_;
6046035553Spatrick
6146035553Spatrick    bool __uses_refcount() const;
6246035553Spatrickpublic:
6346035553Spatrick    explicit __libcpp_refstring(const char* __msg);
6446035553Spatrick    __libcpp_refstring(const __libcpp_refstring& __s) _NOEXCEPT;
6546035553Spatrick    __libcpp_refstring& operator=(const __libcpp_refstring& __s) _NOEXCEPT;
6646035553Spatrick    ~__libcpp_refstring();
6746035553Spatrick
6846035553Spatrick    const char* c_str() const _NOEXCEPT {return __imp_;}
6946035553Spatrick};
7046035553Spatrick#endif // !_LIBCPP_ABI_VCRUNTIME
7146035553Spatrick
7246035553Spatrick_LIBCPP_END_NAMESPACE_STD
7346035553Spatrick
7446035553Spatricknamespace std  // purposefully not using versioning namespace
7546035553Spatrick{
7646035553Spatrick
7746035553Spatrickclass _LIBCPP_EXCEPTION_ABI logic_error
7846035553Spatrick    : public exception
7946035553Spatrick{
8046035553Spatrick#ifndef _LIBCPP_ABI_VCRUNTIME
8146035553Spatrickprivate:
8246035553Spatrick    _VSTD::__libcpp_refstring __imp_;
8346035553Spatrickpublic:
8446035553Spatrick    explicit logic_error(const string&);
8546035553Spatrick    explicit logic_error(const char*);
8646035553Spatrick
8746035553Spatrick    logic_error(const logic_error&) _NOEXCEPT;
8846035553Spatrick    logic_error& operator=(const logic_error&) _NOEXCEPT;
8946035553Spatrick
90*4bdff4beSrobert    ~logic_error() _NOEXCEPT override;
9146035553Spatrick
92*4bdff4beSrobert    const char* what() const _NOEXCEPT override;
9346035553Spatrick#else
9446035553Spatrickpublic:
9546035553Spatrick    explicit logic_error(const _VSTD::string&); // Symbol uses versioned std::string
9646035553Spatrick    _LIBCPP_INLINE_VISIBILITY explicit logic_error(const char* __s) : exception(__s) {}
9746035553Spatrick#endif
9846035553Spatrick};
9946035553Spatrick
10046035553Spatrickclass _LIBCPP_EXCEPTION_ABI runtime_error
10146035553Spatrick    : public exception
10246035553Spatrick{
10346035553Spatrick#ifndef _LIBCPP_ABI_VCRUNTIME
10446035553Spatrickprivate:
10546035553Spatrick    _VSTD::__libcpp_refstring __imp_;
10646035553Spatrickpublic:
10746035553Spatrick    explicit runtime_error(const string&);
10846035553Spatrick    explicit runtime_error(const char*);
10946035553Spatrick
11046035553Spatrick    runtime_error(const runtime_error&) _NOEXCEPT;
11146035553Spatrick    runtime_error& operator=(const runtime_error&) _NOEXCEPT;
11246035553Spatrick
113*4bdff4beSrobert    ~runtime_error() _NOEXCEPT override;
11446035553Spatrick
115*4bdff4beSrobert    const char* what() const _NOEXCEPT override;
11646035553Spatrick#else
11746035553Spatrickpublic:
11846035553Spatrick   explicit runtime_error(const _VSTD::string&); // Symbol uses versioned std::string
11946035553Spatrick   _LIBCPP_INLINE_VISIBILITY explicit runtime_error(const char* __s) : exception(__s) {}
12046035553Spatrick#endif // _LIBCPP_ABI_VCRUNTIME
12146035553Spatrick};
12246035553Spatrick
12346035553Spatrickclass _LIBCPP_EXCEPTION_ABI domain_error
12446035553Spatrick    : public logic_error
12546035553Spatrick{
12646035553Spatrickpublic:
12746035553Spatrick    _LIBCPP_INLINE_VISIBILITY explicit domain_error(const string& __s) : logic_error(__s) {}
12846035553Spatrick    _LIBCPP_INLINE_VISIBILITY explicit domain_error(const char* __s)   : logic_error(__s) {}
12946035553Spatrick
13046035553Spatrick#ifndef _LIBCPP_ABI_VCRUNTIME
131037e7968Spatrick    domain_error(const domain_error&) _NOEXCEPT = default;
132*4bdff4beSrobert    ~domain_error() _NOEXCEPT override;
13346035553Spatrick#endif
13446035553Spatrick};
13546035553Spatrick
13646035553Spatrickclass _LIBCPP_EXCEPTION_ABI invalid_argument
13746035553Spatrick    : public logic_error
13846035553Spatrick{
13946035553Spatrickpublic:
14046035553Spatrick    _LIBCPP_INLINE_VISIBILITY explicit invalid_argument(const string& __s) : logic_error(__s) {}
14146035553Spatrick    _LIBCPP_INLINE_VISIBILITY explicit invalid_argument(const char* __s)   : logic_error(__s) {}
14246035553Spatrick
14346035553Spatrick#ifndef _LIBCPP_ABI_VCRUNTIME
144037e7968Spatrick    invalid_argument(const invalid_argument&) _NOEXCEPT = default;
145*4bdff4beSrobert    ~invalid_argument() _NOEXCEPT override;
14646035553Spatrick#endif
14746035553Spatrick};
14846035553Spatrick
14946035553Spatrickclass _LIBCPP_EXCEPTION_ABI length_error
15046035553Spatrick    : public logic_error
15146035553Spatrick{
15246035553Spatrickpublic:
15346035553Spatrick    _LIBCPP_INLINE_VISIBILITY explicit length_error(const string& __s) : logic_error(__s) {}
15446035553Spatrick    _LIBCPP_INLINE_VISIBILITY explicit length_error(const char* __s)   : logic_error(__s) {}
15546035553Spatrick#ifndef _LIBCPP_ABI_VCRUNTIME
156037e7968Spatrick    length_error(const length_error&) _NOEXCEPT = default;
157*4bdff4beSrobert    ~length_error() _NOEXCEPT override;
15846035553Spatrick#endif
15946035553Spatrick};
16046035553Spatrick
16146035553Spatrickclass _LIBCPP_EXCEPTION_ABI out_of_range
16246035553Spatrick    : public logic_error
16346035553Spatrick{
16446035553Spatrickpublic:
16546035553Spatrick    _LIBCPP_INLINE_VISIBILITY explicit out_of_range(const string& __s) : logic_error(__s) {}
16646035553Spatrick    _LIBCPP_INLINE_VISIBILITY explicit out_of_range(const char* __s)   : logic_error(__s) {}
16746035553Spatrick
16846035553Spatrick#ifndef _LIBCPP_ABI_VCRUNTIME
169037e7968Spatrick    out_of_range(const out_of_range&) _NOEXCEPT = default;
170*4bdff4beSrobert    ~out_of_range() _NOEXCEPT override;
17146035553Spatrick#endif
17246035553Spatrick};
17346035553Spatrick
17446035553Spatrickclass _LIBCPP_EXCEPTION_ABI range_error
17546035553Spatrick    : public runtime_error
17646035553Spatrick{
17746035553Spatrickpublic:
17846035553Spatrick    _LIBCPP_INLINE_VISIBILITY explicit range_error(const string& __s) : runtime_error(__s) {}
17946035553Spatrick    _LIBCPP_INLINE_VISIBILITY explicit range_error(const char* __s)   : runtime_error(__s) {}
18046035553Spatrick
18146035553Spatrick#ifndef _LIBCPP_ABI_VCRUNTIME
182037e7968Spatrick    range_error(const range_error&) _NOEXCEPT = default;
183*4bdff4beSrobert    ~range_error() _NOEXCEPT override;
18446035553Spatrick#endif
18546035553Spatrick};
18646035553Spatrick
18746035553Spatrickclass _LIBCPP_EXCEPTION_ABI overflow_error
18846035553Spatrick    : public runtime_error
18946035553Spatrick{
19046035553Spatrickpublic:
19146035553Spatrick    _LIBCPP_INLINE_VISIBILITY explicit overflow_error(const string& __s) : runtime_error(__s) {}
19246035553Spatrick    _LIBCPP_INLINE_VISIBILITY explicit overflow_error(const char* __s)   : runtime_error(__s) {}
19346035553Spatrick
19446035553Spatrick#ifndef _LIBCPP_ABI_VCRUNTIME
195037e7968Spatrick    overflow_error(const overflow_error&) _NOEXCEPT = default;
196*4bdff4beSrobert    ~overflow_error() _NOEXCEPT override;
19746035553Spatrick#endif
19846035553Spatrick};
19946035553Spatrick
20046035553Spatrickclass _LIBCPP_EXCEPTION_ABI underflow_error
20146035553Spatrick    : public runtime_error
20246035553Spatrick{
20346035553Spatrickpublic:
20446035553Spatrick    _LIBCPP_INLINE_VISIBILITY explicit underflow_error(const string& __s) : runtime_error(__s) {}
20546035553Spatrick    _LIBCPP_INLINE_VISIBILITY explicit underflow_error(const char* __s)   : runtime_error(__s) {}
20646035553Spatrick
20746035553Spatrick#ifndef _LIBCPP_ABI_VCRUNTIME
208037e7968Spatrick    underflow_error(const underflow_error&) _NOEXCEPT = default;
209*4bdff4beSrobert    ~underflow_error() _NOEXCEPT override;
21046035553Spatrick#endif
21146035553Spatrick};
21246035553Spatrick
213*4bdff4beSrobert} // namespace std
21446035553Spatrick
21546035553Spatrick_LIBCPP_BEGIN_NAMESPACE_STD
21646035553Spatrick
21746035553Spatrick// in the dylib
21846035553Spatrick_LIBCPP_NORETURN _LIBCPP_FUNC_VIS void __throw_runtime_error(const char*);
21946035553Spatrick
22046035553Spatrick_LIBCPP_NORETURN inline _LIBCPP_INLINE_VISIBILITY
22146035553Spatrickvoid __throw_logic_error(const char*__msg)
22246035553Spatrick{
22346035553Spatrick#ifndef _LIBCPP_NO_EXCEPTIONS
22446035553Spatrick    throw logic_error(__msg);
22546035553Spatrick#else
22646035553Spatrick    ((void)__msg);
22746035553Spatrick    _VSTD::abort();
22846035553Spatrick#endif
22946035553Spatrick}
23046035553Spatrick
23146035553Spatrick_LIBCPP_NORETURN inline _LIBCPP_INLINE_VISIBILITY
23246035553Spatrickvoid __throw_domain_error(const char*__msg)
23346035553Spatrick{
23446035553Spatrick#ifndef _LIBCPP_NO_EXCEPTIONS
23546035553Spatrick    throw domain_error(__msg);
23646035553Spatrick#else
23746035553Spatrick    ((void)__msg);
23846035553Spatrick    _VSTD::abort();
23946035553Spatrick#endif
24046035553Spatrick}
24146035553Spatrick
24246035553Spatrick_LIBCPP_NORETURN inline _LIBCPP_INLINE_VISIBILITY
24346035553Spatrickvoid __throw_invalid_argument(const char*__msg)
24446035553Spatrick{
24546035553Spatrick#ifndef _LIBCPP_NO_EXCEPTIONS
24646035553Spatrick    throw invalid_argument(__msg);
24746035553Spatrick#else
24846035553Spatrick    ((void)__msg);
24946035553Spatrick    _VSTD::abort();
25046035553Spatrick#endif
25146035553Spatrick}
25246035553Spatrick
25346035553Spatrick_LIBCPP_NORETURN inline _LIBCPP_INLINE_VISIBILITY
25446035553Spatrickvoid __throw_length_error(const char*__msg)
25546035553Spatrick{
25646035553Spatrick#ifndef _LIBCPP_NO_EXCEPTIONS
25746035553Spatrick    throw length_error(__msg);
25846035553Spatrick#else
25946035553Spatrick    ((void)__msg);
26046035553Spatrick    _VSTD::abort();
26146035553Spatrick#endif
26246035553Spatrick}
26346035553Spatrick
26446035553Spatrick_LIBCPP_NORETURN inline _LIBCPP_INLINE_VISIBILITY
26546035553Spatrickvoid __throw_out_of_range(const char*__msg)
26646035553Spatrick{
26746035553Spatrick#ifndef _LIBCPP_NO_EXCEPTIONS
26846035553Spatrick    throw out_of_range(__msg);
26946035553Spatrick#else
27046035553Spatrick    ((void)__msg);
27146035553Spatrick    _VSTD::abort();
27246035553Spatrick#endif
27346035553Spatrick}
27446035553Spatrick
27546035553Spatrick_LIBCPP_NORETURN inline _LIBCPP_INLINE_VISIBILITY
27646035553Spatrickvoid __throw_range_error(const char*__msg)
27746035553Spatrick{
27846035553Spatrick#ifndef _LIBCPP_NO_EXCEPTIONS
27946035553Spatrick    throw range_error(__msg);
28046035553Spatrick#else
28146035553Spatrick    ((void)__msg);
28246035553Spatrick    _VSTD::abort();
28346035553Spatrick#endif
28446035553Spatrick}
28546035553Spatrick
28646035553Spatrick_LIBCPP_NORETURN inline _LIBCPP_INLINE_VISIBILITY
28746035553Spatrickvoid __throw_overflow_error(const char*__msg)
28846035553Spatrick{
28946035553Spatrick#ifndef _LIBCPP_NO_EXCEPTIONS
29046035553Spatrick    throw overflow_error(__msg);
29146035553Spatrick#else
29246035553Spatrick    ((void)__msg);
29346035553Spatrick    _VSTD::abort();
29446035553Spatrick#endif
29546035553Spatrick}
29646035553Spatrick
29746035553Spatrick_LIBCPP_NORETURN inline _LIBCPP_INLINE_VISIBILITY
29846035553Spatrickvoid __throw_underflow_error(const char*__msg)
29946035553Spatrick{
30046035553Spatrick#ifndef _LIBCPP_NO_EXCEPTIONS
30146035553Spatrick    throw underflow_error(__msg);
30246035553Spatrick#else
30346035553Spatrick    ((void)__msg);
30446035553Spatrick    _VSTD::abort();
30546035553Spatrick#endif
30646035553Spatrick}
30746035553Spatrick
30846035553Spatrick_LIBCPP_END_NAMESPACE_STD
30946035553Spatrick
31046035553Spatrick#endif // _LIBCPP_STDEXCEPT
311