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#ifdef _LIBCPP_NO_EXCEPTIONS 48#include <cstdlib> 49#endif 50 51#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 52#pragma GCC system_header 53#endif 54 55_LIBCPP_BEGIN_NAMESPACE_STD 56 57class _LIBCPP_HIDDEN __libcpp_refstring 58{ 59 const char* __imp_; 60 61 bool __uses_refcount() const; 62public: 63 explicit __libcpp_refstring(const char* __msg); 64 __libcpp_refstring(const __libcpp_refstring& __s) _NOEXCEPT; 65 __libcpp_refstring& operator=(const __libcpp_refstring& __s) _NOEXCEPT; 66 ~__libcpp_refstring(); 67 68 const char* c_str() const _NOEXCEPT {return __imp_;} 69}; 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{ 79private: 80 _VSTD::__libcpp_refstring __imp_; 81public: 82 explicit logic_error(const string&); 83 explicit logic_error(const char*); 84 85 logic_error(const logic_error&) _NOEXCEPT; 86 logic_error& operator=(const logic_error&) _NOEXCEPT; 87 88 virtual ~logic_error() _NOEXCEPT; 89 90 virtual const char* what() const _NOEXCEPT; 91}; 92 93class _LIBCPP_EXCEPTION_ABI runtime_error 94 : public exception 95{ 96private: 97 _VSTD::__libcpp_refstring __imp_; 98public: 99 explicit runtime_error(const string&); 100 explicit runtime_error(const char*); 101 102 runtime_error(const runtime_error&) _NOEXCEPT; 103 runtime_error& operator=(const runtime_error&) _NOEXCEPT; 104 105 virtual ~runtime_error() _NOEXCEPT; 106 107 virtual const char* what() const _NOEXCEPT; 108}; 109 110class _LIBCPP_EXCEPTION_ABI domain_error 111 : public logic_error 112{ 113public: 114 _LIBCPP_INLINE_VISIBILITY explicit domain_error(const string& __s) : logic_error(__s) {} 115 _LIBCPP_INLINE_VISIBILITY explicit domain_error(const char* __s) : logic_error(__s) {} 116 117 virtual ~domain_error() _NOEXCEPT; 118}; 119 120class _LIBCPP_EXCEPTION_ABI invalid_argument 121 : public logic_error 122{ 123public: 124 _LIBCPP_INLINE_VISIBILITY explicit invalid_argument(const string& __s) : logic_error(__s) {} 125 _LIBCPP_INLINE_VISIBILITY explicit invalid_argument(const char* __s) : logic_error(__s) {} 126 127 virtual ~invalid_argument() _NOEXCEPT; 128}; 129 130class _LIBCPP_EXCEPTION_ABI length_error 131 : public logic_error 132{ 133public: 134 _LIBCPP_INLINE_VISIBILITY explicit length_error(const string& __s) : logic_error(__s) {} 135 _LIBCPP_INLINE_VISIBILITY explicit length_error(const char* __s) : logic_error(__s) {} 136 137 virtual ~length_error() _NOEXCEPT; 138}; 139 140class _LIBCPP_EXCEPTION_ABI out_of_range 141 : public logic_error 142{ 143public: 144 _LIBCPP_INLINE_VISIBILITY explicit out_of_range(const string& __s) : logic_error(__s) {} 145 _LIBCPP_INLINE_VISIBILITY explicit out_of_range(const char* __s) : logic_error(__s) {} 146 147 virtual ~out_of_range() _NOEXCEPT; 148}; 149 150class _LIBCPP_EXCEPTION_ABI range_error 151 : public runtime_error 152{ 153public: 154 _LIBCPP_INLINE_VISIBILITY explicit range_error(const string& __s) : runtime_error(__s) {} 155 _LIBCPP_INLINE_VISIBILITY explicit range_error(const char* __s) : runtime_error(__s) {} 156 157 virtual ~range_error() _NOEXCEPT; 158}; 159 160class _LIBCPP_EXCEPTION_ABI overflow_error 161 : public runtime_error 162{ 163public: 164 _LIBCPP_INLINE_VISIBILITY explicit overflow_error(const string& __s) : runtime_error(__s) {} 165 _LIBCPP_INLINE_VISIBILITY explicit overflow_error(const char* __s) : runtime_error(__s) {} 166 167 virtual ~overflow_error() _NOEXCEPT; 168}; 169 170class _LIBCPP_EXCEPTION_ABI underflow_error 171 : public runtime_error 172{ 173public: 174 _LIBCPP_INLINE_VISIBILITY explicit underflow_error(const string& __s) : runtime_error(__s) {} 175 _LIBCPP_INLINE_VISIBILITY explicit underflow_error(const char* __s) : runtime_error(__s) {} 176 177 virtual ~underflow_error() _NOEXCEPT; 178}; 179 180} // std 181 182_LIBCPP_BEGIN_NAMESPACE_STD 183 184// in the dylib 185_LIBCPP_NORETURN _LIBCPP_FUNC_VIS void __throw_runtime_error(const char*); 186 187_LIBCPP_NORETURN inline _LIBCPP_INLINE_VISIBILITY 188void __throw_logic_error(const char*__msg) 189{ 190#ifndef _LIBCPP_NO_EXCEPTIONS 191 throw logic_error(__msg); 192#else 193 ((void)__msg); 194 _VSTD::abort(); 195#endif 196} 197 198_LIBCPP_NORETURN inline _LIBCPP_INLINE_VISIBILITY 199void __throw_domain_error(const char*__msg) 200{ 201#ifndef _LIBCPP_NO_EXCEPTIONS 202 throw domain_error(__msg); 203#else 204 ((void)__msg); 205 _VSTD::abort(); 206#endif 207} 208 209_LIBCPP_NORETURN inline _LIBCPP_INLINE_VISIBILITY 210void __throw_invalid_argument(const char*__msg) 211{ 212#ifndef _LIBCPP_NO_EXCEPTIONS 213 throw invalid_argument(__msg); 214#else 215 ((void)__msg); 216 _VSTD::abort(); 217#endif 218} 219 220_LIBCPP_NORETURN inline _LIBCPP_INLINE_VISIBILITY 221void __throw_length_error(const char*__msg) 222{ 223#ifndef _LIBCPP_NO_EXCEPTIONS 224 throw length_error(__msg); 225#else 226 ((void)__msg); 227 _VSTD::abort(); 228#endif 229} 230 231_LIBCPP_NORETURN inline _LIBCPP_INLINE_VISIBILITY 232void __throw_out_of_range(const char*__msg) 233{ 234#ifndef _LIBCPP_NO_EXCEPTIONS 235 throw out_of_range(__msg); 236#else 237 ((void)__msg); 238 _VSTD::abort(); 239#endif 240} 241 242_LIBCPP_NORETURN inline _LIBCPP_INLINE_VISIBILITY 243void __throw_range_error(const char*__msg) 244{ 245#ifndef _LIBCPP_NO_EXCEPTIONS 246 throw range_error(__msg); 247#else 248 ((void)__msg); 249 _VSTD::abort(); 250#endif 251} 252 253_LIBCPP_NORETURN inline _LIBCPP_INLINE_VISIBILITY 254void __throw_overflow_error(const char*__msg) 255{ 256#ifndef _LIBCPP_NO_EXCEPTIONS 257 throw overflow_error(__msg); 258#else 259 ((void)__msg); 260 _VSTD::abort(); 261#endif 262} 263 264_LIBCPP_NORETURN inline _LIBCPP_INLINE_VISIBILITY 265void __throw_underflow_error(const char*__msg) 266{ 267#ifndef _LIBCPP_NO_EXCEPTIONS 268 throw underflow_error(__msg); 269#else 270 ((void)__msg); 271 _VSTD::abort(); 272#endif 273} 274 275_LIBCPP_END_NAMESPACE_STD 276 277#endif // _LIBCPP_STDEXCEPT 278