Home | History | Annotate | Download | only in include
      1 // -*- C++ -*-
      2 //===--------------------------- stdexcept --------------------------------===//
      3 //
      4 //                     The LLVM Compiler Infrastructure
      5 //
      6 // This file is dual licensed under the MIT and the University of Illinois Open
      7 // Source Licenses. See LICENSE.TXT for details.
      8 //
      9 //===----------------------------------------------------------------------===//
     10 
     11 #ifndef _LIBCPP_STDEXCEPT
     12 #define _LIBCPP_STDEXCEPT
     13 
     14 /*
     15     stdexcept synopsis
     16 
     17 namespace std
     18 {
     19 
     20 class logic_error;
     21     class domain_error;
     22     class invalid_argument;
     23     class length_error;
     24     class out_of_range;
     25 class runtime_error;
     26     class range_error;
     27     class overflow_error;
     28     class underflow_error;
     29 
     30 for each class xxx_error:
     31 
     32 class xxx_error : public exception // at least indirectly
     33 {
     34 public:
     35     explicit xxx_error(const string& what_arg);
     36     explicit xxx_error(const char*   what_arg);
     37 
     38     virtual const char* what() const noexcept // returns what_arg
     39 };
     40 
     41 }  // std
     42 
     43 */
     44 
     45 #include <__config>
     46 #include <exception>
     47 #include <iosfwd>  // for string forward decl
     48 #ifdef _LIBCPP_NO_EXCEPTIONS
     49 #include <cstdlib>
     50 #endif
     51 
     52 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
     53 #pragma GCC system_header
     54 #endif
     55 
     56 _LIBCPP_BEGIN_NAMESPACE_STD
     57 
     58 class _LIBCPP_HIDDEN __libcpp_refstring
     59 {
     60     const char* __imp_;
     61 
     62     bool __uses_refcount() const;
     63 public:
     64     explicit __libcpp_refstring(const char* __msg);
     65     __libcpp_refstring(const __libcpp_refstring& __s) _NOEXCEPT;
     66     __libcpp_refstring& operator=(const __libcpp_refstring& __s) _NOEXCEPT;
     67     ~__libcpp_refstring();
     68 
     69     const char* c_str() const _NOEXCEPT {return __imp_;}
     70 };
     71 
     72 _LIBCPP_END_NAMESPACE_STD
     73 
     74 namespace std  // purposefully not using versioning namespace
     75 {
     76 
     77 class _LIBCPP_EXCEPTION_ABI logic_error
     78     : public exception
     79 {
     80 private:
     81     _VSTD::__libcpp_refstring __imp_;
     82 public:
     83     explicit logic_error(const string&);
     84     explicit logic_error(const char*);
     85 
     86     logic_error(const logic_error&) _NOEXCEPT;
     87     logic_error& operator=(const logic_error&) _NOEXCEPT;
     88 
     89     virtual ~logic_error() _NOEXCEPT;
     90 
     91     virtual const char* what() const _NOEXCEPT;
     92 };
     93 
     94 class _LIBCPP_EXCEPTION_ABI runtime_error
     95     : public exception
     96 {
     97 private:
     98     _VSTD::__libcpp_refstring __imp_;
     99 public:
    100     explicit runtime_error(const string&);
    101     explicit runtime_error(const char*);
    102 
    103     runtime_error(const runtime_error&) _NOEXCEPT;
    104     runtime_error& operator=(const runtime_error&) _NOEXCEPT;
    105 
    106     virtual ~runtime_error() _NOEXCEPT;
    107 
    108     virtual const char* what() const _NOEXCEPT;
    109 };
    110 
    111 class _LIBCPP_EXCEPTION_ABI domain_error
    112     : public logic_error
    113 {
    114 public:
    115     _LIBCPP_INLINE_VISIBILITY explicit domain_error(const string& __s) : logic_error(__s) {}
    116     _LIBCPP_INLINE_VISIBILITY explicit domain_error(const char* __s)   : logic_error(__s) {}
    117 
    118     virtual ~domain_error() _NOEXCEPT;
    119 };
    120 
    121 class _LIBCPP_EXCEPTION_ABI invalid_argument
    122     : public logic_error
    123 {
    124 public:
    125     _LIBCPP_INLINE_VISIBILITY explicit invalid_argument(const string& __s) : logic_error(__s) {}
    126     _LIBCPP_INLINE_VISIBILITY explicit invalid_argument(const char* __s)   : logic_error(__s) {}
    127 
    128     virtual ~invalid_argument() _NOEXCEPT;
    129 };
    130 
    131 class _LIBCPP_EXCEPTION_ABI length_error
    132     : public logic_error
    133 {
    134 public:
    135     _LIBCPP_INLINE_VISIBILITY explicit length_error(const string& __s) : logic_error(__s) {}
    136     _LIBCPP_INLINE_VISIBILITY explicit length_error(const char* __s)   : logic_error(__s) {}
    137 
    138     virtual ~length_error() _NOEXCEPT;
    139 };
    140 
    141 class _LIBCPP_EXCEPTION_ABI out_of_range
    142     : public logic_error
    143 {
    144 public:
    145     _LIBCPP_INLINE_VISIBILITY explicit out_of_range(const string& __s) : logic_error(__s) {}
    146     _LIBCPP_INLINE_VISIBILITY explicit out_of_range(const char* __s)   : logic_error(__s) {}
    147 
    148     virtual ~out_of_range() _NOEXCEPT;
    149 };
    150 
    151 class _LIBCPP_EXCEPTION_ABI range_error
    152     : public runtime_error
    153 {
    154 public:
    155     _LIBCPP_INLINE_VISIBILITY explicit range_error(const string& __s) : runtime_error(__s) {}
    156     _LIBCPP_INLINE_VISIBILITY explicit range_error(const char* __s)   : runtime_error(__s) {}
    157 
    158     virtual ~range_error() _NOEXCEPT;
    159 };
    160 
    161 class _LIBCPP_EXCEPTION_ABI overflow_error
    162     : public runtime_error
    163 {
    164 public:
    165     _LIBCPP_INLINE_VISIBILITY explicit overflow_error(const string& __s) : runtime_error(__s) {}
    166     _LIBCPP_INLINE_VISIBILITY explicit overflow_error(const char* __s)   : runtime_error(__s) {}
    167 
    168     virtual ~overflow_error() _NOEXCEPT;
    169 };
    170 
    171 class _LIBCPP_EXCEPTION_ABI underflow_error
    172     : public runtime_error
    173 {
    174 public:
    175     _LIBCPP_INLINE_VISIBILITY explicit underflow_error(const string& __s) : runtime_error(__s) {}
    176     _LIBCPP_INLINE_VISIBILITY explicit underflow_error(const char* __s)   : runtime_error(__s) {}
    177 
    178     virtual ~underflow_error() _NOEXCEPT;
    179 };
    180 
    181 }  // std
    182 
    183 _LIBCPP_BEGIN_NAMESPACE_STD
    184 
    185 // in the dylib
    186 _LIBCPP_NORETURN _LIBCPP_FUNC_VIS void __throw_runtime_error(const char*);
    187 
    188 _LIBCPP_NORETURN inline _LIBCPP_ALWAYS_INLINE
    189 void __throw_logic_error(const char*__msg)
    190 {
    191 #ifndef _LIBCPP_NO_EXCEPTIONS
    192     throw logic_error(__msg);
    193 #else
    194     ((void)__msg);
    195 	  _VSTD::abort();
    196 #endif
    197 }
    198 
    199 _LIBCPP_NORETURN inline _LIBCPP_ALWAYS_INLINE
    200 void __throw_domain_error(const char*__msg)
    201 {
    202 #ifndef _LIBCPP_NO_EXCEPTIONS
    203     throw domain_error(__msg);
    204 #else
    205     ((void)__msg);
    206 	  _VSTD::abort();
    207 #endif
    208 }
    209 
    210 _LIBCPP_NORETURN inline _LIBCPP_ALWAYS_INLINE
    211 void __throw_invalid_argument(const char*__msg)
    212 {
    213 #ifndef _LIBCPP_NO_EXCEPTIONS
    214     throw invalid_argument(__msg);
    215 #else
    216     ((void)__msg);
    217 	  _VSTD::abort();
    218 #endif
    219 }
    220 
    221 _LIBCPP_NORETURN inline _LIBCPP_ALWAYS_INLINE
    222 void __throw_length_error(const char*__msg)
    223 {
    224 #ifndef _LIBCPP_NO_EXCEPTIONS
    225     throw length_error(__msg);
    226 #else
    227     ((void)__msg);
    228 	  _VSTD::abort();
    229 #endif
    230 }
    231 
    232 _LIBCPP_NORETURN inline _LIBCPP_ALWAYS_INLINE
    233 void __throw_out_of_range(const char*__msg)
    234 {
    235 #ifndef _LIBCPP_NO_EXCEPTIONS
    236     throw out_of_range(__msg);
    237 #else
    238     ((void)__msg);
    239 	  _VSTD::abort();
    240 #endif
    241 }
    242 
    243 _LIBCPP_NORETURN inline _LIBCPP_ALWAYS_INLINE
    244 void __throw_range_error(const char*__msg)
    245 {
    246 #ifndef _LIBCPP_NO_EXCEPTIONS
    247     throw range_error(__msg);
    248 #else
    249     ((void)__msg);
    250 	  _VSTD::abort();
    251 #endif
    252 }
    253 
    254 _LIBCPP_NORETURN inline _LIBCPP_ALWAYS_INLINE
    255 void __throw_overflow_error(const char*__msg)
    256 {
    257 #ifndef _LIBCPP_NO_EXCEPTIONS
    258     throw overflow_error(__msg);
    259 #else
    260     ((void)__msg);
    261     _VSTD::abort();
    262 #endif
    263 }
    264 
    265 _LIBCPP_NORETURN inline _LIBCPP_ALWAYS_INLINE
    266 void __throw_underflow_error(const char*__msg)
    267 {
    268 #ifndef _LIBCPP_NO_EXCEPTIONS
    269     throw underflow_error(__msg);
    270 #else
    271     ((void)__msg);
    272     _VSTD::abort();
    273 #endif
    274 }
    275 
    276 _LIBCPP_END_NAMESPACE_STD
    277 
    278 #endif  // _LIBCPP_STDEXCEPT
    279