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