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
483e519524SHoward Hinnant
49073458b1SHoward Hinnant#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
503e519524SHoward Hinnant#pragma GCC system_header
51073458b1SHoward Hinnant#endif
523e519524SHoward Hinnant
53a1fbf345SJoerg Sonnenberger#ifndef _LIBCPP___REFSTRING
54a1fbf345SJoerg Sonnenberger_LIBCPP_BEGIN_NAMESPACE_STD
55a1fbf345SJoerg Sonnenbergerclass _LIBCPP_HIDDEN __libcpp_refstring {
5689dd1dd2SEric Fiselier#ifdef __clang__
5789dd1dd2SEric Fiselier    const char *__imp_ __attribute__((__unused__)); // only clang emits a warning
5889dd1dd2SEric Fiselier#else
5989dd1dd2SEric Fiselier    const char *__imp_;
6089dd1dd2SEric Fiselier#endif
61a1fbf345SJoerg Sonnenberger};
62a1fbf345SJoerg Sonnenberger_LIBCPP_END_NAMESPACE_STD
63a1fbf345SJoerg Sonnenberger#endif
64a1fbf345SJoerg Sonnenberger
653e519524SHoward Hinnantnamespace std  // purposefully not using versioning namespace
663e519524SHoward Hinnant{
673e519524SHoward Hinnant
683e519524SHoward Hinnantclass _LIBCPP_EXCEPTION_ABI logic_error
693e519524SHoward Hinnant    : public exception
703e519524SHoward Hinnant{
713e519524SHoward Hinnantprivate:
72a1fbf345SJoerg Sonnenberger    _VSTD::__libcpp_refstring __imp_;
733e519524SHoward Hinnantpublic:
743e519524SHoward Hinnant    explicit logic_error(const string&);
753e519524SHoward Hinnant    explicit logic_error(const char*);
763e519524SHoward Hinnant
77a62f2899SHoward Hinnant    logic_error(const logic_error&) _NOEXCEPT;
78a62f2899SHoward Hinnant    logic_error& operator=(const logic_error&) _NOEXCEPT;
793e519524SHoward Hinnant
80a62f2899SHoward Hinnant    virtual ~logic_error() _NOEXCEPT;
813e519524SHoward Hinnant
82a62f2899SHoward Hinnant    virtual const char* what() const _NOEXCEPT;
833e519524SHoward Hinnant};
843e519524SHoward Hinnant
853e519524SHoward Hinnantclass _LIBCPP_EXCEPTION_ABI runtime_error
863e519524SHoward Hinnant    : public exception
873e519524SHoward Hinnant{
883e519524SHoward Hinnantprivate:
89a1fbf345SJoerg Sonnenberger    _VSTD::__libcpp_refstring __imp_;
903e519524SHoward Hinnantpublic:
913e519524SHoward Hinnant    explicit runtime_error(const string&);
923e519524SHoward Hinnant    explicit runtime_error(const char*);
933e519524SHoward Hinnant
94a62f2899SHoward Hinnant    runtime_error(const runtime_error&) _NOEXCEPT;
95a62f2899SHoward Hinnant    runtime_error& operator=(const runtime_error&) _NOEXCEPT;
963e519524SHoward Hinnant
97a62f2899SHoward Hinnant    virtual ~runtime_error() _NOEXCEPT;
983e519524SHoward Hinnant
99a62f2899SHoward Hinnant    virtual const char* what() const _NOEXCEPT;
1003e519524SHoward Hinnant};
1013e519524SHoward Hinnant
1023e519524SHoward Hinnantclass _LIBCPP_EXCEPTION_ABI domain_error
1033e519524SHoward Hinnant    : public logic_error
1043e519524SHoward Hinnant{
1053e519524SHoward Hinnantpublic:
1063e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY explicit domain_error(const string& __s) : logic_error(__s) {}
1073e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY explicit domain_error(const char* __s)   : logic_error(__s) {}
1083e519524SHoward Hinnant
109a62f2899SHoward Hinnant    virtual ~domain_error() _NOEXCEPT;
1103e519524SHoward Hinnant};
1113e519524SHoward Hinnant
1123e519524SHoward Hinnantclass _LIBCPP_EXCEPTION_ABI invalid_argument
1133e519524SHoward Hinnant    : public logic_error
1143e519524SHoward Hinnant{
1153e519524SHoward Hinnantpublic:
1163e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY explicit invalid_argument(const string& __s) : logic_error(__s) {}
1173e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY explicit invalid_argument(const char* __s)   : logic_error(__s) {}
1183e519524SHoward Hinnant
119a62f2899SHoward Hinnant    virtual ~invalid_argument() _NOEXCEPT;
1203e519524SHoward Hinnant};
1213e519524SHoward Hinnant
1223e519524SHoward Hinnantclass _LIBCPP_EXCEPTION_ABI length_error
1233e519524SHoward Hinnant    : public logic_error
1243e519524SHoward Hinnant{
1253e519524SHoward Hinnantpublic:
1263e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY explicit length_error(const string& __s) : logic_error(__s) {}
1273e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY explicit length_error(const char* __s)   : logic_error(__s) {}
1283e519524SHoward Hinnant
129a62f2899SHoward Hinnant    virtual ~length_error() _NOEXCEPT;
1303e519524SHoward Hinnant};
1313e519524SHoward Hinnant
1323e519524SHoward Hinnantclass _LIBCPP_EXCEPTION_ABI out_of_range
1333e519524SHoward Hinnant    : public logic_error
1343e519524SHoward Hinnant{
1353e519524SHoward Hinnantpublic:
1363e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY explicit out_of_range(const string& __s) : logic_error(__s) {}
1373e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY explicit out_of_range(const char* __s)   : logic_error(__s) {}
1383e519524SHoward Hinnant
139a62f2899SHoward Hinnant    virtual ~out_of_range() _NOEXCEPT;
1403e519524SHoward Hinnant};
1413e519524SHoward Hinnant
1423e519524SHoward Hinnantclass _LIBCPP_EXCEPTION_ABI range_error
1433e519524SHoward Hinnant    : public runtime_error
1443e519524SHoward Hinnant{
1453e519524SHoward Hinnantpublic:
1463e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY explicit range_error(const string& __s) : runtime_error(__s) {}
1473e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY explicit range_error(const char* __s)   : runtime_error(__s) {}
1483e519524SHoward Hinnant
149a62f2899SHoward Hinnant    virtual ~range_error() _NOEXCEPT;
1503e519524SHoward Hinnant};
1513e519524SHoward Hinnant
1523e519524SHoward Hinnantclass _LIBCPP_EXCEPTION_ABI overflow_error
1533e519524SHoward Hinnant    : public runtime_error
1543e519524SHoward Hinnant{
1553e519524SHoward Hinnantpublic:
1563e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY explicit overflow_error(const string& __s) : runtime_error(__s) {}
1573e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY explicit overflow_error(const char* __s)   : runtime_error(__s) {}
1583e519524SHoward Hinnant
159a62f2899SHoward Hinnant    virtual ~overflow_error() _NOEXCEPT;
1603e519524SHoward Hinnant};
1613e519524SHoward Hinnant
1623e519524SHoward Hinnantclass _LIBCPP_EXCEPTION_ABI underflow_error
1633e519524SHoward Hinnant    : public runtime_error
1643e519524SHoward Hinnant{
1653e519524SHoward Hinnantpublic:
1663e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY explicit underflow_error(const string& __s) : runtime_error(__s) {}
1673e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY explicit underflow_error(const char* __s)   : runtime_error(__s) {}
1683e519524SHoward Hinnant
169a62f2899SHoward Hinnant    virtual ~underflow_error() _NOEXCEPT;
1703e519524SHoward Hinnant};
1713e519524SHoward Hinnant
1723e519524SHoward Hinnant}  // std
1733e519524SHoward Hinnant
174*d437fa5cSMarshall Clow_LIBCPP_BEGIN_NAMESPACE_STD
175*d437fa5cSMarshall Clow
176*d437fa5cSMarshall Clow// in the dylib
177*d437fa5cSMarshall Clow_LIBCPP_NORETURN _LIBCPP_FUNC_VIS void __throw_runtime_error(const char*);
178*d437fa5cSMarshall Clow
179*d437fa5cSMarshall Clow_LIBCPP_NORETURN inline _LIBCPP_ALWAYS_INLINE
180*d437fa5cSMarshall Clowvoid __throw_logic_error(const char*__msg)
181*d437fa5cSMarshall Clow{
182*d437fa5cSMarshall Clow#ifndef _LIBCPP_NO_EXCEPTIONS
183*d437fa5cSMarshall Clow    throw logic_error(__msg);
184*d437fa5cSMarshall Clow#else
185*d437fa5cSMarshall Clow	_VSTD::abort();
186*d437fa5cSMarshall Clow#endif
187*d437fa5cSMarshall Clow}
188*d437fa5cSMarshall Clow
189*d437fa5cSMarshall Clow_LIBCPP_NORETURN inline _LIBCPP_ALWAYS_INLINE
190*d437fa5cSMarshall Clowvoid __throw_domain_error(const char*__msg)
191*d437fa5cSMarshall Clow{
192*d437fa5cSMarshall Clow#ifndef _LIBCPP_NO_EXCEPTIONS
193*d437fa5cSMarshall Clow    throw domain_error(__msg);
194*d437fa5cSMarshall Clow#else
195*d437fa5cSMarshall Clow	_VSTD::abort();
196*d437fa5cSMarshall Clow#endif
197*d437fa5cSMarshall Clow}
198*d437fa5cSMarshall Clow
199*d437fa5cSMarshall Clow_LIBCPP_NORETURN inline _LIBCPP_ALWAYS_INLINE
200*d437fa5cSMarshall Clowvoid __throw_invalid_argument(const char*__msg)
201*d437fa5cSMarshall Clow{
202*d437fa5cSMarshall Clow#ifndef _LIBCPP_NO_EXCEPTIONS
203*d437fa5cSMarshall Clow    throw invalid_argument(__msg);
204*d437fa5cSMarshall Clow#else
205*d437fa5cSMarshall Clow	_VSTD::abort();
206*d437fa5cSMarshall Clow#endif
207*d437fa5cSMarshall Clow}
208*d437fa5cSMarshall Clow
209*d437fa5cSMarshall Clow_LIBCPP_NORETURN inline _LIBCPP_ALWAYS_INLINE
210*d437fa5cSMarshall Clowvoid __throw_length_error(const char*__msg)
211*d437fa5cSMarshall Clow{
212*d437fa5cSMarshall Clow#ifndef _LIBCPP_NO_EXCEPTIONS
213*d437fa5cSMarshall Clow    throw length_error(__msg);
214*d437fa5cSMarshall Clow#else
215*d437fa5cSMarshall Clow	_VSTD::abort();
216*d437fa5cSMarshall Clow#endif
217*d437fa5cSMarshall Clow}
218*d437fa5cSMarshall Clow
219*d437fa5cSMarshall Clow_LIBCPP_NORETURN inline _LIBCPP_ALWAYS_INLINE
220*d437fa5cSMarshall Clowvoid __throw_out_of_range(const char*__msg)
221*d437fa5cSMarshall Clow{
222*d437fa5cSMarshall Clow#ifndef _LIBCPP_NO_EXCEPTIONS
223*d437fa5cSMarshall Clow    throw out_of_range(__msg);
224*d437fa5cSMarshall Clow#else
225*d437fa5cSMarshall Clow	_VSTD::abort();
226*d437fa5cSMarshall Clow#endif
227*d437fa5cSMarshall Clow}
228*d437fa5cSMarshall Clow
229*d437fa5cSMarshall Clow_LIBCPP_NORETURN inline _LIBCPP_ALWAYS_INLINE
230*d437fa5cSMarshall Clowvoid __throw_range_error(const char*__msg)
231*d437fa5cSMarshall Clow{
232*d437fa5cSMarshall Clow#ifndef _LIBCPP_NO_EXCEPTIONS
233*d437fa5cSMarshall Clow    throw range_error(__msg);
234*d437fa5cSMarshall Clow#else
235*d437fa5cSMarshall Clow	_VSTD::abort();
236*d437fa5cSMarshall Clow#endif
237*d437fa5cSMarshall Clow}
238*d437fa5cSMarshall Clow
239*d437fa5cSMarshall Clow_LIBCPP_NORETURN inline _LIBCPP_ALWAYS_INLINE
240*d437fa5cSMarshall Clowvoid __throw_overflow_error(const char*__msg)
241*d437fa5cSMarshall Clow{
242*d437fa5cSMarshall Clow#ifndef _LIBCPP_NO_EXCEPTIONS
243*d437fa5cSMarshall Clow    throw overflow_error(__msg);
244*d437fa5cSMarshall Clow#else
245*d437fa5cSMarshall Clow	_VSTD::abort();
246*d437fa5cSMarshall Clow#endif
247*d437fa5cSMarshall Clow}
248*d437fa5cSMarshall Clow
249*d437fa5cSMarshall Clow_LIBCPP_NORETURN inline _LIBCPP_ALWAYS_INLINE
250*d437fa5cSMarshall Clowvoid __throw_underflow_error(const char*__msg)
251*d437fa5cSMarshall Clow{
252*d437fa5cSMarshall Clow#ifndef _LIBCPP_NO_EXCEPTIONS
253*d437fa5cSMarshall Clow    throw underflow_error(__msg);
254*d437fa5cSMarshall Clow#else
255*d437fa5cSMarshall Clow	_VSTD::abort();
256*d437fa5cSMarshall Clow#endif
257*d437fa5cSMarshall Clow}
258*d437fa5cSMarshall Clow
259*d437fa5cSMarshall Clow_LIBCPP_END_NAMESPACE_STD
260*d437fa5cSMarshall Clow
2613e519524SHoward Hinnant#endif  // _LIBCPP_STDEXCEPT
262