13e519524SHoward Hinnant// -*- C++ -*-
23e519524SHoward Hinnant//===--------------------------- stdexcept --------------------------------===//
33e519524SHoward Hinnant//
45b08a8a4SHoward Hinnant//                     The LLVM Compiler Infrastructure
53e519524SHoward Hinnant//
6412dbebeSHoward Hinnant// This file is dual licensed under the MIT and the University of Illinois Open
7412dbebeSHoward Hinnant// Source Licenses. See LICENSE.TXT for details.
83e519524SHoward Hinnant//
93e519524SHoward Hinnant//===----------------------------------------------------------------------===//
103e519524SHoward Hinnant
113e519524SHoward Hinnant#ifndef _LIBCPP_STDEXCEPT
123e519524SHoward Hinnant#define _LIBCPP_STDEXCEPT
133e519524SHoward Hinnant
143e519524SHoward Hinnant/*
153e519524SHoward Hinnant    stdexcept synopsis
163e519524SHoward Hinnant
173e519524SHoward Hinnantnamespace std
183e519524SHoward Hinnant{
193e519524SHoward Hinnant
203e519524SHoward Hinnantclass logic_error;
213e519524SHoward Hinnant    class domain_error;
223e519524SHoward Hinnant    class invalid_argument;
233e519524SHoward Hinnant    class length_error;
243e519524SHoward Hinnant    class out_of_range;
253e519524SHoward Hinnantclass runtime_error;
263e519524SHoward Hinnant    class range_error;
273e519524SHoward Hinnant    class overflow_error;
283e519524SHoward Hinnant    class underflow_error;
293e519524SHoward Hinnant
303e519524SHoward Hinnantfor each class xxx_error:
313e519524SHoward Hinnant
323e519524SHoward Hinnantclass xxx_error : public exception // at least indirectly
333e519524SHoward Hinnant{
343e519524SHoward Hinnantpublic:
353e519524SHoward Hinnant    explicit xxx_error(const string& what_arg);
36a62f2899SHoward Hinnant    explicit xxx_error(const char*   what_arg);
373e519524SHoward Hinnant
38a62f2899SHoward Hinnant    virtual const char* what() const noexcept // returns what_arg
393e519524SHoward Hinnant};
403e519524SHoward Hinnant
413e519524SHoward Hinnant}  // std
423e519524SHoward Hinnant
433e519524SHoward Hinnant*/
443e519524SHoward Hinnant
453e519524SHoward Hinnant#include <__config>
463e519524SHoward Hinnant#include <exception>
473e519524SHoward Hinnant#include <iosfwd>  // for string forward decl
48b683ec20SEric Fiselier#ifdef _LIBCPP_NO_EXCEPTIONS
49b683ec20SEric Fiselier#include <cstdlib>
50b683ec20SEric Fiselier#endif
513e519524SHoward Hinnant
52073458b1SHoward Hinnant#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
533e519524SHoward Hinnant#pragma GCC system_header
54073458b1SHoward Hinnant#endif
553e519524SHoward Hinnant
56a1fbf345SJoerg Sonnenberger_LIBCPP_BEGIN_NAMESPACE_STD
57a624409cSEric Fiselier
58a624409cSEric Fiselierclass _LIBCPP_HIDDEN __libcpp_refstring
59a624409cSEric Fiselier{
6089dd1dd2SEric Fiselier    const char* __imp_;
61a624409cSEric Fiselier
62a624409cSEric Fiselier    bool __uses_refcount() const;
63a624409cSEric Fiselierpublic:
64*9ffacf3dSEric Fiselier    explicit __libcpp_refstring(const char* __msg);
65*9ffacf3dSEric Fiselier    __libcpp_refstring(const __libcpp_refstring& __s) _NOEXCEPT;
66*9ffacf3dSEric Fiselier    __libcpp_refstring& operator=(const __libcpp_refstring& __s) _NOEXCEPT;
67a624409cSEric Fiselier    ~__libcpp_refstring();
68a624409cSEric Fiselier
69a624409cSEric Fiselier    const char* c_str() const _NOEXCEPT {return __imp_;}
70a1fbf345SJoerg Sonnenberger};
71a624409cSEric Fiselier
72a1fbf345SJoerg Sonnenberger_LIBCPP_END_NAMESPACE_STD
73a1fbf345SJoerg Sonnenberger
743e519524SHoward Hinnantnamespace std  // purposefully not using versioning namespace
753e519524SHoward Hinnant{
763e519524SHoward Hinnant
773e519524SHoward Hinnantclass _LIBCPP_EXCEPTION_ABI logic_error
783e519524SHoward Hinnant    : public exception
793e519524SHoward Hinnant{
803e519524SHoward Hinnantprivate:
81a1fbf345SJoerg Sonnenberger    _VSTD::__libcpp_refstring __imp_;
823e519524SHoward Hinnantpublic:
833e519524SHoward Hinnant    explicit logic_error(const string&);
843e519524SHoward Hinnant    explicit logic_error(const char*);
853e519524SHoward Hinnant
86a62f2899SHoward Hinnant    logic_error(const logic_error&) _NOEXCEPT;
87a62f2899SHoward Hinnant    logic_error& operator=(const logic_error&) _NOEXCEPT;
883e519524SHoward Hinnant
89a62f2899SHoward Hinnant    virtual ~logic_error() _NOEXCEPT;
903e519524SHoward Hinnant
91a62f2899SHoward Hinnant    virtual const char* what() const _NOEXCEPT;
923e519524SHoward Hinnant};
933e519524SHoward Hinnant
943e519524SHoward Hinnantclass _LIBCPP_EXCEPTION_ABI runtime_error
953e519524SHoward Hinnant    : public exception
963e519524SHoward Hinnant{
973e519524SHoward Hinnantprivate:
98a1fbf345SJoerg Sonnenberger    _VSTD::__libcpp_refstring __imp_;
993e519524SHoward Hinnantpublic:
1003e519524SHoward Hinnant    explicit runtime_error(const string&);
1013e519524SHoward Hinnant    explicit runtime_error(const char*);
1023e519524SHoward Hinnant
103a62f2899SHoward Hinnant    runtime_error(const runtime_error&) _NOEXCEPT;
104a62f2899SHoward Hinnant    runtime_error& operator=(const runtime_error&) _NOEXCEPT;
1053e519524SHoward Hinnant
106a62f2899SHoward Hinnant    virtual ~runtime_error() _NOEXCEPT;
1073e519524SHoward Hinnant
108a62f2899SHoward Hinnant    virtual const char* what() const _NOEXCEPT;
1093e519524SHoward Hinnant};
1103e519524SHoward Hinnant
1113e519524SHoward Hinnantclass _LIBCPP_EXCEPTION_ABI domain_error
1123e519524SHoward Hinnant    : public logic_error
1133e519524SHoward Hinnant{
1143e519524SHoward Hinnantpublic:
1153e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY explicit domain_error(const string& __s) : logic_error(__s) {}
1163e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY explicit domain_error(const char* __s)   : logic_error(__s) {}
1173e519524SHoward Hinnant
118a62f2899SHoward Hinnant    virtual ~domain_error() _NOEXCEPT;
1193e519524SHoward Hinnant};
1203e519524SHoward Hinnant
1213e519524SHoward Hinnantclass _LIBCPP_EXCEPTION_ABI invalid_argument
1223e519524SHoward Hinnant    : public logic_error
1233e519524SHoward Hinnant{
1243e519524SHoward Hinnantpublic:
1253e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY explicit invalid_argument(const string& __s) : logic_error(__s) {}
1263e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY explicit invalid_argument(const char* __s)   : logic_error(__s) {}
1273e519524SHoward Hinnant
128a62f2899SHoward Hinnant    virtual ~invalid_argument() _NOEXCEPT;
1293e519524SHoward Hinnant};
1303e519524SHoward Hinnant
1313e519524SHoward Hinnantclass _LIBCPP_EXCEPTION_ABI length_error
1323e519524SHoward Hinnant    : public logic_error
1333e519524SHoward Hinnant{
1343e519524SHoward Hinnantpublic:
1353e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY explicit length_error(const string& __s) : logic_error(__s) {}
1363e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY explicit length_error(const char* __s)   : logic_error(__s) {}
1373e519524SHoward Hinnant
138a62f2899SHoward Hinnant    virtual ~length_error() _NOEXCEPT;
1393e519524SHoward Hinnant};
1403e519524SHoward Hinnant
1413e519524SHoward Hinnantclass _LIBCPP_EXCEPTION_ABI out_of_range
1423e519524SHoward Hinnant    : public logic_error
1433e519524SHoward Hinnant{
1443e519524SHoward Hinnantpublic:
1453e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY explicit out_of_range(const string& __s) : logic_error(__s) {}
1463e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY explicit out_of_range(const char* __s)   : logic_error(__s) {}
1473e519524SHoward Hinnant
148a62f2899SHoward Hinnant    virtual ~out_of_range() _NOEXCEPT;
1493e519524SHoward Hinnant};
1503e519524SHoward Hinnant
1513e519524SHoward Hinnantclass _LIBCPP_EXCEPTION_ABI range_error
1523e519524SHoward Hinnant    : public runtime_error
1533e519524SHoward Hinnant{
1543e519524SHoward Hinnantpublic:
1553e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY explicit range_error(const string& __s) : runtime_error(__s) {}
1563e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY explicit range_error(const char* __s)   : runtime_error(__s) {}
1573e519524SHoward Hinnant
158a62f2899SHoward Hinnant    virtual ~range_error() _NOEXCEPT;
1593e519524SHoward Hinnant};
1603e519524SHoward Hinnant
1613e519524SHoward Hinnantclass _LIBCPP_EXCEPTION_ABI overflow_error
1623e519524SHoward Hinnant    : public runtime_error
1633e519524SHoward Hinnant{
1643e519524SHoward Hinnantpublic:
1653e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY explicit overflow_error(const string& __s) : runtime_error(__s) {}
1663e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY explicit overflow_error(const char* __s)   : runtime_error(__s) {}
1673e519524SHoward Hinnant
168a62f2899SHoward Hinnant    virtual ~overflow_error() _NOEXCEPT;
1693e519524SHoward Hinnant};
1703e519524SHoward Hinnant
1713e519524SHoward Hinnantclass _LIBCPP_EXCEPTION_ABI underflow_error
1723e519524SHoward Hinnant    : public runtime_error
1733e519524SHoward Hinnant{
1743e519524SHoward Hinnantpublic:
1753e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY explicit underflow_error(const string& __s) : runtime_error(__s) {}
1763e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY explicit underflow_error(const char* __s)   : runtime_error(__s) {}
1773e519524SHoward Hinnant
178a62f2899SHoward Hinnant    virtual ~underflow_error() _NOEXCEPT;
1793e519524SHoward Hinnant};
1803e519524SHoward Hinnant
1813e519524SHoward Hinnant}  // std
1823e519524SHoward Hinnant
183d437fa5cSMarshall Clow_LIBCPP_BEGIN_NAMESPACE_STD
184d437fa5cSMarshall Clow
185d437fa5cSMarshall Clow// in the dylib
186d437fa5cSMarshall Clow_LIBCPP_NORETURN _LIBCPP_FUNC_VIS void __throw_runtime_error(const char*);
187d437fa5cSMarshall Clow
188d437fa5cSMarshall Clow_LIBCPP_NORETURN inline _LIBCPP_ALWAYS_INLINE
189d437fa5cSMarshall Clowvoid __throw_logic_error(const char*__msg)
190d437fa5cSMarshall Clow{
191d437fa5cSMarshall Clow#ifndef _LIBCPP_NO_EXCEPTIONS
192d437fa5cSMarshall Clow    throw logic_error(__msg);
193d437fa5cSMarshall Clow#else
194fd838227SEric Fiselier    ((void)__msg);
195d437fa5cSMarshall Clow	  _VSTD::abort();
196d437fa5cSMarshall Clow#endif
197d437fa5cSMarshall Clow}
198d437fa5cSMarshall Clow
199d437fa5cSMarshall Clow_LIBCPP_NORETURN inline _LIBCPP_ALWAYS_INLINE
200d437fa5cSMarshall Clowvoid __throw_domain_error(const char*__msg)
201d437fa5cSMarshall Clow{
202d437fa5cSMarshall Clow#ifndef _LIBCPP_NO_EXCEPTIONS
203d437fa5cSMarshall Clow    throw domain_error(__msg);
204d437fa5cSMarshall Clow#else
205fd838227SEric Fiselier    ((void)__msg);
206d437fa5cSMarshall Clow	  _VSTD::abort();
207d437fa5cSMarshall Clow#endif
208d437fa5cSMarshall Clow}
209d437fa5cSMarshall Clow
210d437fa5cSMarshall Clow_LIBCPP_NORETURN inline _LIBCPP_ALWAYS_INLINE
211d437fa5cSMarshall Clowvoid __throw_invalid_argument(const char*__msg)
212d437fa5cSMarshall Clow{
213d437fa5cSMarshall Clow#ifndef _LIBCPP_NO_EXCEPTIONS
214d437fa5cSMarshall Clow    throw invalid_argument(__msg);
215d437fa5cSMarshall Clow#else
216fd838227SEric Fiselier    ((void)__msg);
217d437fa5cSMarshall Clow	  _VSTD::abort();
218d437fa5cSMarshall Clow#endif
219d437fa5cSMarshall Clow}
220d437fa5cSMarshall Clow
221d437fa5cSMarshall Clow_LIBCPP_NORETURN inline _LIBCPP_ALWAYS_INLINE
222d437fa5cSMarshall Clowvoid __throw_length_error(const char*__msg)
223d437fa5cSMarshall Clow{
224d437fa5cSMarshall Clow#ifndef _LIBCPP_NO_EXCEPTIONS
225d437fa5cSMarshall Clow    throw length_error(__msg);
226d437fa5cSMarshall Clow#else
227fd838227SEric Fiselier    ((void)__msg);
228d437fa5cSMarshall Clow	  _VSTD::abort();
229d437fa5cSMarshall Clow#endif
230d437fa5cSMarshall Clow}
231d437fa5cSMarshall Clow
232d437fa5cSMarshall Clow_LIBCPP_NORETURN inline _LIBCPP_ALWAYS_INLINE
233d437fa5cSMarshall Clowvoid __throw_out_of_range(const char*__msg)
234d437fa5cSMarshall Clow{
235d437fa5cSMarshall Clow#ifndef _LIBCPP_NO_EXCEPTIONS
236d437fa5cSMarshall Clow    throw out_of_range(__msg);
237d437fa5cSMarshall Clow#else
238fd838227SEric Fiselier    ((void)__msg);
239d437fa5cSMarshall Clow	  _VSTD::abort();
240d437fa5cSMarshall Clow#endif
241d437fa5cSMarshall Clow}
242d437fa5cSMarshall Clow
243d437fa5cSMarshall Clow_LIBCPP_NORETURN inline _LIBCPP_ALWAYS_INLINE
244d437fa5cSMarshall Clowvoid __throw_range_error(const char*__msg)
245d437fa5cSMarshall Clow{
246d437fa5cSMarshall Clow#ifndef _LIBCPP_NO_EXCEPTIONS
247d437fa5cSMarshall Clow    throw range_error(__msg);
248d437fa5cSMarshall Clow#else
249fd838227SEric Fiselier    ((void)__msg);
250d437fa5cSMarshall Clow	  _VSTD::abort();
251d437fa5cSMarshall Clow#endif
252d437fa5cSMarshall Clow}
253d437fa5cSMarshall Clow
254d437fa5cSMarshall Clow_LIBCPP_NORETURN inline _LIBCPP_ALWAYS_INLINE
255d437fa5cSMarshall Clowvoid __throw_overflow_error(const char*__msg)
256d437fa5cSMarshall Clow{
257d437fa5cSMarshall Clow#ifndef _LIBCPP_NO_EXCEPTIONS
258d437fa5cSMarshall Clow    throw overflow_error(__msg);
259d437fa5cSMarshall Clow#else
260fd838227SEric Fiselier    ((void)__msg);
261d437fa5cSMarshall Clow    _VSTD::abort();
262d437fa5cSMarshall Clow#endif
263d437fa5cSMarshall Clow}
264d437fa5cSMarshall Clow
265d437fa5cSMarshall Clow_LIBCPP_NORETURN inline _LIBCPP_ALWAYS_INLINE
266d437fa5cSMarshall Clowvoid __throw_underflow_error(const char*__msg)
267d437fa5cSMarshall Clow{
268d437fa5cSMarshall Clow#ifndef _LIBCPP_NO_EXCEPTIONS
269d437fa5cSMarshall Clow    throw underflow_error(__msg);
270d437fa5cSMarshall Clow#else
271fd838227SEric Fiselier    ((void)__msg);
272d437fa5cSMarshall Clow    _VSTD::abort();
273d437fa5cSMarshall Clow#endif
274d437fa5cSMarshall Clow}
275d437fa5cSMarshall Clow
276d437fa5cSMarshall Clow_LIBCPP_END_NAMESPACE_STD
277d437fa5cSMarshall Clow
2783e519524SHoward Hinnant#endif  // _LIBCPP_STDEXCEPT
279