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