testsuite: fix PR111613 test
[official-gcc.git] / libstdc++-v3 / include / std / stdexcept
blobb55c19bbfe2943c43f478ff4c03d9f5b5ecfc6fd
1 // Standard exception classes  -*- C++ -*-
3 // Copyright (C) 2001-2024 Free Software Foundation, Inc.
4 //
5 // This file is part of the GNU ISO C++ Library.  This library is free
6 // software; you can redistribute it and/or modify it under the
7 // terms of the GNU General Public License as published by the
8 // Free Software Foundation; either version 3, or (at your option)
9 // any later version.
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 // GNU General Public License for more details.
16 // Under Section 7 of GPL version 3, you are granted additional
17 // permissions described in the GCC Runtime Library Exception, version
18 // 3.1, as published by the Free Software Foundation.
20 // You should have received a copy of the GNU General Public License and
21 // a copy of the GCC Runtime Library Exception along with this program;
22 // see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
23 // <http://www.gnu.org/licenses/>.
25 /** @file include/stdexcept
26  *  This is a Standard C++ Library header.
27  */
30 // ISO C++ 19.1  Exception classes
33 #ifndef _GLIBCXX_STDEXCEPT
34 #define _GLIBCXX_STDEXCEPT 1
36 #pragma GCC system_header
38 #include <exception>
39 #include <string>
41 namespace std _GLIBCXX_VISIBILITY(default)
43 _GLIBCXX_BEGIN_NAMESPACE_VERSION
45 #if _GLIBCXX_USE_DUAL_ABI
46 #if _GLIBCXX_USE_CXX11_ABI
47   // Emulates an old COW string when the new std::string is in use.
48   struct __cow_string
49   {
50     union {
51       const char* _M_p;
52       char _M_bytes[sizeof(const char*)];
53     };
55     __cow_string();
56     __cow_string(const std::string&);
57     __cow_string(const char*, size_t);
58     __cow_string(const __cow_string&) _GLIBCXX_NOTHROW;
59     __cow_string& operator=(const __cow_string&) _GLIBCXX_NOTHROW;
60     ~__cow_string();
61 #if __cplusplus >= 201103L
62     __cow_string(__cow_string&&) noexcept;
63     __cow_string& operator=(__cow_string&&) noexcept;
64 #endif
65   };
67   typedef basic_string<char> __sso_string;
68 #else // _GLIBCXX_USE_CXX11_ABI
69   typedef basic_string<char> __cow_string;
71   // Emulates a new SSO string when the old std::string is in use.
72   struct __sso_string
73   {
74     struct __str
75     {
76       const char* _M_p;
77       size_t _M_string_length;
78       char _M_local_buf[16];
79     };
81     union {
82       __str _M_s;
83       char _M_bytes[sizeof(__str)];
84     };
86     __sso_string() _GLIBCXX_NOTHROW;
87     __sso_string(const std::string&);
88     __sso_string(const char*, size_t);
89     __sso_string(const __sso_string&);
90     __sso_string& operator=(const __sso_string&);
91     ~__sso_string();
92 #if __cplusplus >= 201103L
93     __sso_string(__sso_string&&) noexcept;
94     __sso_string& operator=(__sso_string&&) noexcept;
95 #endif
96   };
97 #endif // _GLIBCXX_USE_CXX11_ABI
98 #else  // _GLIBCXX_USE_DUAL_ABI
99   typedef basic_string<char> __sso_string;
100   typedef basic_string<char> __cow_string;
101 #endif
103   /**
104    * @addtogroup exceptions
105    * @{
106    */
108   /** Logic errors represent problems in the internal logic of a program;
109    *  in theory, these are preventable, and even detectable before the
110    *  program runs (e.g., violations of class invariants).
111    *  @brief One of two subclasses of exception.
112    */
113   class logic_error : public exception
114   {
115     __cow_string _M_msg;
117   public:
118     /** Takes a character string describing the error.  */
119     explicit
120     logic_error(const string& __arg) _GLIBCXX_TXN_SAFE;
122 #if __cplusplus >= 201103L
123     explicit
124     logic_error(const char*) _GLIBCXX_TXN_SAFE;
126     logic_error(logic_error&&) noexcept;
127     logic_error& operator=(logic_error&&) noexcept;
128 #endif
130 #if _GLIBCXX_USE_CXX11_ABI || _GLIBCXX_DEFINE_STDEXCEPT_COPY_OPS
131     logic_error(const logic_error&) _GLIBCXX_NOTHROW;
132     logic_error& operator=(const logic_error&) _GLIBCXX_NOTHROW;
133 #elif __cplusplus >= 201103L
134     logic_error(const logic_error&) = default;
135     logic_error& operator=(const logic_error&) = default;
136 #endif
138     virtual ~logic_error() _GLIBCXX_TXN_SAFE_DYN _GLIBCXX_NOTHROW;
140     /** Returns a C-style character string describing the general cause of
141      *  the current error (the same string passed to the ctor).  */
142     virtual const char*
143     what() const _GLIBCXX_TXN_SAFE_DYN _GLIBCXX_NOTHROW;
145 # ifdef _GLIBCXX_TM_TS_INTERNAL
146     friend void*
147     ::_txnal_logic_error_get_msg(void* e);
148 # endif
149   };
151   /** Thrown by the library, or by you, to report domain errors (domain in
152    *  the mathematical sense).  */
153   class domain_error : public logic_error
154   {
155   public:
156     explicit domain_error(const string& __arg) _GLIBCXX_TXN_SAFE;
157 #if __cplusplus >= 201103L
158     explicit domain_error(const char*) _GLIBCXX_TXN_SAFE;
159     domain_error(const domain_error&) = default;
160     domain_error& operator=(const domain_error&) = default;
161     domain_error(domain_error&&) = default;
162     domain_error& operator=(domain_error&&) = default;
163 #endif
164     virtual ~domain_error() _GLIBCXX_NOTHROW;
165   };
167   /** Thrown to report invalid arguments to functions.  */
168   class invalid_argument : public logic_error
169   {
170   public:
171     explicit invalid_argument(const string& __arg) _GLIBCXX_TXN_SAFE;
172 #if __cplusplus >= 201103L
173     explicit invalid_argument(const char*) _GLIBCXX_TXN_SAFE;
174     invalid_argument(const invalid_argument&) = default;
175     invalid_argument& operator=(const invalid_argument&) = default;
176     invalid_argument(invalid_argument&&) = default;
177     invalid_argument& operator=(invalid_argument&&) = default;
178 #endif
179     virtual ~invalid_argument() _GLIBCXX_NOTHROW;
180   };
182   /** Thrown when an object is constructed that would exceed its maximum
183    *  permitted size (e.g., a basic_string instance).  */
184   class length_error : public logic_error
185   {
186   public:
187     explicit length_error(const string& __arg) _GLIBCXX_TXN_SAFE;
188 #if __cplusplus >= 201103L
189     explicit length_error(const char*) _GLIBCXX_TXN_SAFE;
190     length_error(const length_error&) = default;
191     length_error& operator=(const length_error&) = default;
192     length_error(length_error&&) = default;
193     length_error& operator=(length_error&&) = default;
194 #endif
195     virtual ~length_error() _GLIBCXX_NOTHROW;
196   };
198   /** This represents an argument whose value is not within the expected
199    *  range (e.g., boundary checks in basic_string).  */
200   class out_of_range : public logic_error
201   {
202   public:
203     explicit out_of_range(const string& __arg) _GLIBCXX_TXN_SAFE;
204 #if __cplusplus >= 201103L
205     explicit out_of_range(const char*) _GLIBCXX_TXN_SAFE;
206     out_of_range(const out_of_range&) = default;
207     out_of_range& operator=(const out_of_range&) = default;
208     out_of_range(out_of_range&&) = default;
209     out_of_range& operator=(out_of_range&&) = default;
210 #endif
211     virtual ~out_of_range() _GLIBCXX_NOTHROW;
212   };
214   /** Runtime errors represent problems outside the scope of a program;
215    *  they cannot be easily predicted and can generally only be caught as
216    *  the program executes.
217    *  @brief One of two subclasses of exception.
218    */
219   class runtime_error : public exception
220   {
221     __cow_string _M_msg;
223   public:
224     /** Takes a character string describing the error.  */
225     explicit
226     runtime_error(const string& __arg) _GLIBCXX_TXN_SAFE;
228 #if __cplusplus >= 201103L
229     explicit
230     runtime_error(const char*) _GLIBCXX_TXN_SAFE;
232     runtime_error(runtime_error&&) noexcept;
233     runtime_error& operator=(runtime_error&&) noexcept;
234 #endif
236 #if _GLIBCXX_USE_CXX11_ABI || _GLIBCXX_DEFINE_STDEXCEPT_COPY_OPS
237     runtime_error(const runtime_error&) _GLIBCXX_NOTHROW;
238     runtime_error& operator=(const runtime_error&) _GLIBCXX_NOTHROW;
239 #elif __cplusplus >= 201103L
240     runtime_error(const runtime_error&) = default;
241     runtime_error& operator=(const runtime_error&) = default;
242 #endif
244     virtual ~runtime_error() _GLIBCXX_TXN_SAFE_DYN _GLIBCXX_NOTHROW;
246     /** Returns a C-style character string describing the general cause of
247      *  the current error (the same string passed to the ctor).  */
248     virtual const char*
249     what() const _GLIBCXX_TXN_SAFE_DYN _GLIBCXX_NOTHROW;
251 # ifdef _GLIBCXX_TM_TS_INTERNAL
252     friend void*
253     ::_txnal_runtime_error_get_msg(void* e);
254 # endif
255   };
257   /** Thrown to indicate range errors in internal computations.  */
258   class range_error : public runtime_error
259   {
260   public:
261     explicit range_error(const string& __arg) _GLIBCXX_TXN_SAFE;
262 #if __cplusplus >= 201103L
263     explicit range_error(const char*) _GLIBCXX_TXN_SAFE;
264     range_error(const range_error&) = default;
265     range_error& operator=(const range_error&) = default;
266     range_error(range_error&&) = default;
267     range_error& operator=(range_error&&) = default;
268 #endif
269     virtual ~range_error() _GLIBCXX_NOTHROW;
270   };
272   /** Thrown to indicate arithmetic overflow.  */
273   class overflow_error : public runtime_error
274   {
275   public:
276     explicit overflow_error(const string& __arg) _GLIBCXX_TXN_SAFE;
277 #if __cplusplus >= 201103L
278     explicit overflow_error(const char*) _GLIBCXX_TXN_SAFE;
279     overflow_error(const overflow_error&) = default;
280     overflow_error& operator=(const overflow_error&) = default;
281     overflow_error(overflow_error&&) = default;
282     overflow_error& operator=(overflow_error&&) = default;
283 #endif
284     virtual ~overflow_error() _GLIBCXX_NOTHROW;
285   };
287   /** Thrown to indicate arithmetic underflow.  */
288   class underflow_error : public runtime_error
289   {
290   public:
291     explicit underflow_error(const string& __arg) _GLIBCXX_TXN_SAFE;
292 #if __cplusplus >= 201103L
293     explicit underflow_error(const char*) _GLIBCXX_TXN_SAFE;
294     underflow_error(const underflow_error&) = default;
295     underflow_error& operator=(const underflow_error&) = default;
296     underflow_error(underflow_error&&) = default;
297     underflow_error& operator=(underflow_error&&) = default;
298 #endif
299     virtual ~underflow_error() _GLIBCXX_NOTHROW;
300   };
302   /// @} group exceptions
304 _GLIBCXX_END_NAMESPACE_VERSION
305 } // namespace
307 #endif /* _GLIBCXX_STDEXCEPT */