// Exception classes for -*- C++ -*- // Copyright (C) 2001-2026 Free Software Foundation, Inc. // // This file is part of the GNU ISO C++ Library. This library is free // software; you can redistribute it and/or modify it under the // terms of the GNU General Public License as published by the // Free Software Foundation; either version 3, or (at your option) // any later version. // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // Under Section 7 of GPL version 3, you are granted additional // permissions described in the GCC Runtime Library Exception, version // 3.1, as published by the Free Software Foundation. // You should have received a copy of the GNU General Public License and // a copy of the GCC Runtime Library Exception along with this program; // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see // . /** @file bits/stdexcept_except.h * This is an internal header file, included by other library headers. * Do not attempt to use it directly. @headername{stdexcept} */ #ifndef _STDEXCEPT_EXCEPT_H #define _STDEXCEPT_EXCEPT_H 1 #include #include namespace std _GLIBCXX_VISIBILITY(default) { _GLIBCXX_BEGIN_NAMESPACE_VERSION #if _GLIBCXX_USE_DUAL_ABI #if _GLIBCXX_USE_CXX11_ABI #if __cpp_lib_constexpr_exceptions >= 202502L struct __cow_constexpr_string; namespace __detail { extern "C" { void _ZNSt12__cow_stringC2EPKcm(__cow_constexpr_string*, const char*, unsigned long); void _ZNSt12__cow_stringC2EPKcj(__cow_constexpr_string*, const char*, unsigned int); void _ZNSt12__cow_stringC2EPKcy(__cow_constexpr_string*, const char*, unsigned long long); void _ZNSt12__cow_stringC2EPKc(__cow_constexpr_string*, const char*); void _ZNSt12__cow_stringC2ERKS_(__cow_constexpr_string*, const __cow_constexpr_string&) noexcept; void _ZNSt12__cow_stringC2EOS_(__cow_constexpr_string*, __cow_constexpr_string&&) noexcept; void _ZNSt12__cow_stringD2Ev(__cow_constexpr_string*); __cow_constexpr_string& _ZNSt12__cow_stringaSERKS_(__cow_constexpr_string*, const __cow_constexpr_string&) noexcept; __cow_constexpr_string& _ZNSt12__cow_stringaSEOS_(__cow_constexpr_string*, __cow_constexpr_string&&) noexcept; const char* _ZNKSt12__cow_string5c_strEv(const __cow_constexpr_string*) noexcept; } } // namespace __detail // Emulates an old COW string when the new std::string is in use, // but in addition is constexpr and uses the __cow_string out of // line cdtors/methods unless manifestly constant evaluated. struct __cow_constexpr_string { union { const char* _M_p; char _M_bytes[sizeof(const char*)]; string* _M_str; }; [[__gnu__::__always_inline__]] constexpr __cow_constexpr_string(const string& __o) { if consteval { _M_str = new string(__o); } else { __cow_constexpr_string_ctor(__o.c_str(), __o.length()); } } [[__gnu__::__always_inline__]] inline void __cow_constexpr_string_ctor(const char *__s, unsigned long __l) { __detail::_ZNSt12__cow_stringC2EPKcm(this, __s, __l); } [[__gnu__::__always_inline__]] inline void __cow_constexpr_string_ctor(const char *__s, unsigned int __l) { __detail::_ZNSt12__cow_stringC2EPKcj(this, __s, __l); } [[__gnu__::__always_inline__]] inline void __cow_constexpr_string_ctor(const char *__s, unsigned long long __l) { __detail::_ZNSt12__cow_stringC2EPKcy(this, __s, __l); } [[__gnu__::__always_inline__]] constexpr __cow_constexpr_string(const char* __o) { if consteval { _M_str = new string(__o); } else { __detail::_ZNSt12__cow_stringC2EPKc(this, __o); } } [[__gnu__::__always_inline__]] constexpr __cow_constexpr_string(const __cow_constexpr_string& __o) noexcept { if consteval { _M_str = new string(*__o._M_str); } else { __detail::_ZNSt12__cow_stringC2ERKS_(this, __o); } } [[__gnu__::__always_inline__]] constexpr __cow_constexpr_string& operator=(const __cow_constexpr_string& __o) noexcept { if consteval { string* __p = _M_str; _M_str = new string(*__o._M_str); delete __p; return *this; } else { return __detail::_ZNSt12__cow_stringaSERKS_(this, __o); } } [[__gnu__::__always_inline__]] constexpr ~__cow_constexpr_string() { if consteval { delete _M_str; } else { __detail::_ZNSt12__cow_stringD2Ev(this); } } [[__gnu__::__always_inline__]] constexpr __cow_constexpr_string(__cow_constexpr_string&& __o) noexcept { if consteval { _M_str = new string(std::move(*__o._M_str)); } else { __detail::_ZNSt12__cow_stringC2EOS_(this, std::move(__o)); } } [[__gnu__::__always_inline__]] constexpr __cow_constexpr_string& operator=(__cow_constexpr_string&& __o) noexcept { if consteval { string* __p = _M_str; _M_str = new string(std::move(*__o._M_str)); delete __p; return *this; } else { return __detail::_ZNSt12__cow_stringaSEOS_(this, std::move(__o)); } } [[__gnu__::__always_inline__]] constexpr const char* c_str() const noexcept { if consteval { return _M_str->c_str(); } else { return __detail::_ZNKSt12__cow_string5c_strEv(this); } } }; typedef __cow_constexpr_string __cow_string; #else // Emulates an old COW string when the new std::string is in use. struct __cow_string { union { const char* _M_p; char _M_bytes[sizeof(const char*)]; }; __cow_string(); __cow_string(const std::string&); __cow_string(const char*, size_t); __cow_string(const __cow_string&) _GLIBCXX_NOTHROW; __cow_string& operator=(const __cow_string&) _GLIBCXX_NOTHROW; ~__cow_string(); #if __cplusplus >= 201103L __cow_string(__cow_string&&) noexcept; __cow_string& operator=(__cow_string&&) noexcept; #endif }; #endif typedef basic_string __sso_string; #else // _GLIBCXX_USE_CXX11_ABI typedef basic_string __cow_string; // Emulates a new SSO string when the old std::string is in use. struct __sso_string { struct __str { const char* _M_p; size_t _M_string_length; char _M_local_buf[16]; }; union { __str _M_s; char _M_bytes[sizeof(__str)]; }; __sso_string() _GLIBCXX_NOTHROW; __sso_string(const std::string&); __sso_string(const char*, size_t); __sso_string(const __sso_string&); __sso_string& operator=(const __sso_string&); ~__sso_string(); #if __cplusplus >= 201103L __sso_string(__sso_string&&) noexcept; __sso_string& operator=(__sso_string&&) noexcept; #endif }; #endif // _GLIBCXX_USE_CXX11_ABI #else // _GLIBCXX_USE_DUAL_ABI typedef basic_string __sso_string; typedef basic_string __cow_string; #endif /** * @addtogroup exceptions * @{ */ /** Logic errors represent problems in the internal logic of a program; * in theory, these are preventable, and even detectable before the * program runs (e.g., violations of class invariants). * @brief One of two subclasses of exception. */ class logic_error : public exception { __cow_string _M_msg; public: #if __cpp_lib_constexpr_exceptions >= 202502L [[__gnu__::__gnu_inline__]] constexpr inline explicit logic_error(const string& __arg) _GLIBCXX_TXN_SAFE : _M_msg(__arg) {} [[__gnu__::__gnu_inline__]] constexpr inline explicit logic_error(const char* __arg) _GLIBCXX_TXN_SAFE : _M_msg(__arg) {} constexpr logic_error(logic_error&& __arg) noexcept = default; constexpr logic_error& operator=(logic_error&& __arg) noexcept = default; constexpr logic_error(const logic_error&) noexcept = default; constexpr logic_error& operator=(const logic_error&) noexcept = default; [[__gnu__::__gnu_inline__]] constexpr inline virtual ~logic_error() _GLIBCXX_TXN_SAFE_DYN noexcept { } [[__gnu__::__gnu_inline__]] constexpr inline virtual const char* what() const _GLIBCXX_TXN_SAFE_DYN noexcept { return _M_msg.c_str(); } #else /** Takes a character string describing the error. */ explicit logic_error(const string& __arg) _GLIBCXX_TXN_SAFE; #if __cplusplus >= 201103L explicit logic_error(const char*) _GLIBCXX_TXN_SAFE; logic_error(logic_error&&) noexcept; logic_error& operator=(logic_error&&) noexcept; #endif #if _GLIBCXX_USE_CXX11_ABI || _GLIBCXX_DEFINE_STDEXCEPT_COPY_OPS logic_error(const logic_error&) _GLIBCXX_NOTHROW; logic_error& operator=(const logic_error&) _GLIBCXX_NOTHROW; #elif __cplusplus >= 201103L logic_error(const logic_error&) = default; logic_error& operator=(const logic_error&) = default; #endif virtual ~logic_error() _GLIBCXX_TXN_SAFE_DYN _GLIBCXX_NOTHROW; /** Returns a C-style character string describing the general cause of * the current error (the same string passed to the ctor). */ virtual const char* what() const _GLIBCXX_TXN_SAFE_DYN _GLIBCXX_NOTHROW; #endif # ifdef _GLIBCXX_TM_TS_INTERNAL friend void* ::_txnal_logic_error_get_msg(void* e); # endif }; /** Thrown by the library, or by you, to report domain errors (domain in * the mathematical sense). */ class domain_error : public logic_error { public: #if __cpp_lib_constexpr_exceptions >= 202502L [[__gnu__::__gnu_inline__]] constexpr inline explicit domain_error(const string& __arg) _GLIBCXX_TXN_SAFE : logic_error(__arg) { } [[__gnu__::__gnu_inline__]] constexpr inline explicit domain_error(const char* __arg) _GLIBCXX_TXN_SAFE : logic_error(__arg) { } constexpr domain_error(const domain_error&) = default; constexpr domain_error& operator=(const domain_error&) = default; constexpr domain_error(domain_error&&) = default; constexpr domain_error& operator=(domain_error&&) = default; [[__gnu__::__gnu_inline__]] constexpr inline virtual ~domain_error() noexcept { } #else explicit domain_error(const string& __arg) _GLIBCXX_TXN_SAFE; #if __cplusplus >= 201103L explicit domain_error(const char*) _GLIBCXX_TXN_SAFE; domain_error(const domain_error&) = default; domain_error& operator=(const domain_error&) = default; domain_error(domain_error&&) = default; domain_error& operator=(domain_error&&) = default; #endif virtual ~domain_error() _GLIBCXX_NOTHROW; #endif }; /** Thrown to report invalid arguments to functions. */ class invalid_argument : public logic_error { public: #if __cpp_lib_constexpr_exceptions >= 202502L [[__gnu__::__gnu_inline__]] constexpr inline explicit invalid_argument(const string& __arg) _GLIBCXX_TXN_SAFE : logic_error(__arg) { } [[__gnu__::__gnu_inline__]] constexpr inline explicit invalid_argument(const char* __arg) _GLIBCXX_TXN_SAFE : logic_error(__arg) { } constexpr invalid_argument(const invalid_argument&) = default; constexpr invalid_argument& operator=(const invalid_argument&) = default; constexpr invalid_argument(invalid_argument&&) = default; constexpr invalid_argument& operator=(invalid_argument&&) = default; [[__gnu__::__gnu_inline__]] constexpr inline virtual ~invalid_argument() noexcept { } #else explicit invalid_argument(const string& __arg) _GLIBCXX_TXN_SAFE; #if __cplusplus >= 201103L explicit invalid_argument(const char*) _GLIBCXX_TXN_SAFE; invalid_argument(const invalid_argument&) = default; invalid_argument& operator=(const invalid_argument&) = default; invalid_argument(invalid_argument&&) = default; invalid_argument& operator=(invalid_argument&&) = default; #endif virtual ~invalid_argument() _GLIBCXX_NOTHROW; #endif }; /** Thrown when an object is constructed that would exceed its maximum * permitted size (e.g., a basic_string instance). */ class length_error : public logic_error { public: #if __cpp_lib_constexpr_exceptions >= 202502L [[__gnu__::__gnu_inline__]] constexpr inline explicit length_error(const string& __arg) _GLIBCXX_TXN_SAFE : logic_error(__arg) { } [[__gnu__::__gnu_inline__]] constexpr inline explicit length_error(const char* __arg) _GLIBCXX_TXN_SAFE : logic_error(__arg) { } constexpr length_error(const length_error&) = default; constexpr length_error& operator=(const length_error&) = default; constexpr length_error(length_error&&) = default; constexpr length_error& operator=(length_error&&) = default; [[__gnu__::__gnu_inline__]] constexpr inline virtual ~length_error() noexcept { } #else explicit length_error(const string& __arg) _GLIBCXX_TXN_SAFE; #if __cplusplus >= 201103L explicit length_error(const char*) _GLIBCXX_TXN_SAFE; length_error(const length_error&) = default; length_error& operator=(const length_error&) = default; length_error(length_error&&) = default; length_error& operator=(length_error&&) = default; #endif virtual ~length_error() _GLIBCXX_NOTHROW; #endif }; /** This represents an argument whose value is not within the expected * range (e.g., boundary checks in basic_string). */ class out_of_range : public logic_error { public: #if __cpp_lib_constexpr_exceptions >= 202502L [[__gnu__::__gnu_inline__]] constexpr inline explicit out_of_range(const string& __arg) _GLIBCXX_TXN_SAFE : logic_error(__arg) { } [[__gnu__::__gnu_inline__]] constexpr inline explicit out_of_range(const char* __arg) _GLIBCXX_TXN_SAFE : logic_error(__arg) { } constexpr out_of_range(const out_of_range&) = default; constexpr out_of_range& operator=(const out_of_range&) = default; constexpr out_of_range(out_of_range&&) = default; constexpr out_of_range& operator=(out_of_range&&) = default; [[__gnu__::__gnu_inline__]] constexpr inline virtual ~out_of_range() noexcept { } #else explicit out_of_range(const string& __arg) _GLIBCXX_TXN_SAFE; #if __cplusplus >= 201103L explicit out_of_range(const char*) _GLIBCXX_TXN_SAFE; out_of_range(const out_of_range&) = default; out_of_range& operator=(const out_of_range&) = default; out_of_range(out_of_range&&) = default; out_of_range& operator=(out_of_range&&) = default; #endif virtual ~out_of_range() _GLIBCXX_NOTHROW; #endif }; /** Runtime errors represent problems outside the scope of a program; * they cannot be easily predicted and can generally only be caught as * the program executes. * @brief One of two subclasses of exception. */ class runtime_error : public exception { __cow_string _M_msg; public: #if __cpp_lib_constexpr_exceptions >= 202502L [[__gnu__::__gnu_inline__]] constexpr inline explicit runtime_error(const string& __arg) _GLIBCXX_TXN_SAFE : _M_msg(__arg) {} [[__gnu__::__gnu_inline__]] constexpr inline explicit runtime_error(const char* __arg) _GLIBCXX_TXN_SAFE : _M_msg(__arg) {} constexpr runtime_error(runtime_error&&) noexcept = default; constexpr runtime_error& operator=(runtime_error&&) noexcept = default; constexpr runtime_error(const runtime_error&) noexcept = default; runtime_error& operator=(const runtime_error&) noexcept = default; [[__gnu__::__gnu_inline__]] constexpr inline virtual ~runtime_error() _GLIBCXX_TXN_SAFE_DYN noexcept {} [[__gnu__::__gnu_inline__]] constexpr inline virtual const char* what() const _GLIBCXX_TXN_SAFE_DYN noexcept { return _M_msg.c_str(); } #else /** Takes a character string describing the error. */ explicit runtime_error(const string& __arg) _GLIBCXX_TXN_SAFE; #if __cplusplus >= 201103L explicit runtime_error(const char*) _GLIBCXX_TXN_SAFE; runtime_error(runtime_error&&) noexcept; runtime_error& operator=(runtime_error&&) noexcept; #endif #if _GLIBCXX_USE_CXX11_ABI || _GLIBCXX_DEFINE_STDEXCEPT_COPY_OPS runtime_error(const runtime_error&) _GLIBCXX_NOTHROW; runtime_error& operator=(const runtime_error&) _GLIBCXX_NOTHROW; #elif __cplusplus >= 201103L runtime_error(const runtime_error&) = default; runtime_error& operator=(const runtime_error&) = default; #endif virtual ~runtime_error() _GLIBCXX_TXN_SAFE_DYN _GLIBCXX_NOTHROW; /** Returns a C-style character string describing the general cause of * the current error (the same string passed to the ctor). */ virtual const char* what() const _GLIBCXX_TXN_SAFE_DYN _GLIBCXX_NOTHROW; #endif # ifdef _GLIBCXX_TM_TS_INTERNAL friend void* ::_txnal_runtime_error_get_msg(void* e); # endif }; /** Thrown to indicate arithmetic overflow. */ class overflow_error : public runtime_error { public: #if __cpp_lib_constexpr_exceptions >= 202502L [[__gnu__::__gnu_inline__]] constexpr inline explicit overflow_error(const string& __arg) _GLIBCXX_TXN_SAFE : runtime_error(__arg) { } [[__gnu__::__gnu_inline__]] constexpr inline explicit overflow_error(const char* __arg) _GLIBCXX_TXN_SAFE : runtime_error(__arg) { } constexpr overflow_error(const overflow_error&) = default; constexpr overflow_error& operator=(const overflow_error&) = default; constexpr overflow_error(overflow_error&&) = default; constexpr overflow_error& operator=(overflow_error&&) = default; [[__gnu__::__gnu_inline__]] constexpr inline virtual ~overflow_error() noexcept { } #else explicit overflow_error(const string& __arg) _GLIBCXX_TXN_SAFE; #if __cplusplus >= 201103L explicit overflow_error(const char*) _GLIBCXX_TXN_SAFE; overflow_error(const overflow_error&) = default; overflow_error& operator=(const overflow_error&) = default; overflow_error(overflow_error&&) = default; overflow_error& operator=(overflow_error&&) = default; #endif virtual ~overflow_error() _GLIBCXX_NOTHROW; #endif }; /** Thrown to indicate arithmetic underflow. */ class underflow_error : public runtime_error { public: #if __cpp_lib_constexpr_exceptions >= 202502L [[__gnu__::__gnu_inline__]] constexpr inline explicit underflow_error(const string& __arg) _GLIBCXX_TXN_SAFE : runtime_error(__arg) { } [[__gnu__::__gnu_inline__]] constexpr inline explicit underflow_error(const char* __arg) _GLIBCXX_TXN_SAFE : runtime_error(__arg) { } constexpr underflow_error(const underflow_error&) = default; constexpr underflow_error& operator=(const underflow_error&) = default; constexpr underflow_error(underflow_error&&) = default; constexpr underflow_error& operator=(underflow_error&&) = default; [[__gnu__::__gnu_inline__]] constexpr inline virtual ~underflow_error() noexcept { } #else explicit underflow_error(const string& __arg) _GLIBCXX_TXN_SAFE; #if __cplusplus >= 201103L explicit underflow_error(const char*) _GLIBCXX_TXN_SAFE; underflow_error(const underflow_error&) = default; underflow_error& operator=(const underflow_error&) = default; underflow_error(underflow_error&&) = default; underflow_error& operator=(underflow_error&&) = default; #endif virtual ~underflow_error() _GLIBCXX_NOTHROW; #endif }; /// @} group exceptions _GLIBCXX_END_NAMESPACE_VERSION } // namespace #endif /* _STDEXCEPT_EXCEPT_H */