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 16namespace std 17{ 18 19class logic_error; 20 class domain_error; 21 class invalid_argument; 22 class length_error; 23 class out_of_range; 24class runtime_error; 25 class range_error; 26 class overflow_error; 27 class underflow_error; 28 29for each class xxx_error: 30 31class xxx_error : public exception // at least indirectly 32{ 33public: 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 <exception> 46#include <iosfwd> // for string forward decl 47#include <cstdlib> 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 56class _LIBCPP_HIDDEN __libcpp_refstring 57{ 58 const char* __imp_; 59 60 bool __uses_refcount() const; 61public: 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 73namespace std // purposefully not using versioning namespace 74{ 75 76class _LIBCPP_EXCEPTION_ABI logic_error 77 : public exception 78{ 79#ifndef _LIBCPP_ABI_VCRUNTIME 80private: 81 _VSTD::__libcpp_refstring __imp_; 82public: 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 93public: 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 99class _LIBCPP_EXCEPTION_ABI runtime_error 100 : public exception 101{ 102#ifndef _LIBCPP_ABI_VCRUNTIME 103private: 104 _VSTD::__libcpp_refstring __imp_; 105public: 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 116public: 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 122class _LIBCPP_EXCEPTION_ABI domain_error 123 : public logic_error 124{ 125public: 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 135class _LIBCPP_EXCEPTION_ABI invalid_argument 136 : public logic_error 137{ 138public: 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 148class _LIBCPP_EXCEPTION_ABI length_error 149 : public logic_error 150{ 151public: 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 160class _LIBCPP_EXCEPTION_ABI out_of_range 161 : public logic_error 162{ 163public: 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 173class _LIBCPP_EXCEPTION_ABI range_error 174 : public runtime_error 175{ 176public: 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 186class _LIBCPP_EXCEPTION_ABI overflow_error 187 : public runtime_error 188{ 189public: 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 199class _LIBCPP_EXCEPTION_ABI underflow_error 200 : public runtime_error 201{ 202public: 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 220void __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 231void __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 242void __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 253void __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 264void __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 275void __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 286void __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 297void __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