[PATCH] libstdc++, v3: Implement C++26 P3378R2 - constexpr exception types [PR121114]
Jonathan Wakely
jwakely@redhat.com
Thu Dec 4 12:26:36 GMT 2025
On Sat, 06 Sep 2025 at 11:17 +0200, Jakub Jelinek wrote:
>On Wed, Aug 13, 2025 at 12:55:40PM +0200, Jakub Jelinek wrote:
>> Or if the multiple inclusion bits/functexcept.h header is too costly, we
>> could instead split it into multiple headers, each with normal header
>> guards:
>> 1) bits/functexcept.h would stay for the __throw_* functions which are (at
>> least for now) never constexpr (the <ios>, <system_error>, <future>
>> and <functional> std::exception derived classes)
>> 2) bits/exception_{throw,except}.h for __throw_bad_exception and
>> std::bad_exception (where <exception> would include <bits/exception_except.h>
>> and <bits/exception_throw.h> as well for the C++26 constexpr exceptions case)
>> 3) similarly for the <new> and <typeinfo> cases,
>> bits/new_{throw,except}.h and bits/typeinfo_{throw,except}.h (or
>> _functexcept.h vs. _except.h ?)
>> 4) for the most complicated <stdexcept> stuff, we'd probably need in
>> addition to bits/stdexcept.h one header for the __throw_logic_error etc.
>> forward declarations, one header for the __throw_logic_error etc.
>> definitions and perhaps one header without header guards which will
>> depending on __glibcxx_exc_in_string include one or the other
>
>The following variant of the patch implements the above.
>
>Compared to the earlier version with a large multiple inclusion header
>bits/functexcept.h this one has just small bits/stdexcept_throw.h multiple
>inclusion header (to deal with the <stdexcept> vs. <string> vs.
><string_view> vs. headers those include mess for C++26) which for actual
>definitions includes just other headers with inclusion guards.
>
>Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
>
>Looking at line number counts for
>echo '#include <bits/stdc++.h>' | g++ -E -std=c++{23,26} -xc++ -
>I see
> 197529 231.ii
> 197951 232.ii
> 197714 233.ii
> 205765 261.ii
> 206487 262.ii
> 206234 263.ii
>where first 2 digits are the C++ version and last is 1 for unmodified
>source, 2 for
>https://gcc.gnu.org/pipermail/gcc-patches/2025-August/692482.html and
>3 for this patch.
>
>2025-09-06 Jakub Jelinek <jakub@redhat.com>
>
> PR libstdc++/121114
>libstdc++-v3/
> * include/bits/version.def: Implement C++26 P3378R2 - constexpr
> exception types.
> (constexpr_exceptions): Change value from 1 to 202502, remove
> no_stdname and TODO comments.
> * include/bits/version.h: Regenerate.
> * src/c++11/cow-stdexcept.cc (__cow_string(const char*)): New
> ctor.
> (__cow_string::c_str()): New method.
> * config/abi/pre/gnu.ver (GLIBCXX_3.4.35): Export 8 __cow_string
> symbols.
> * include/bits/exception_except.h: New file.
> * include/bits/exception_throw.h: New file.
> * include/bits/new_except.h: New file.
> * include/bits/new_throw.h: New file.
> * include/bits/stexcept_throw.h: New file.
> * include/bits/stexcept_throwdef.h: New file.
> * include/bits/stexcept_throwfwd.h: New file.
> * include/bits/typeinfo_except.h: New file.
> * include/bits/typeinfo_throw.h: New file.
> * include/std/stdexcept: Include bits/stdexcept_except.h and move
> everything after <string> include into ...
> * include/bits/stdexcept_except.h: ... this new header. Also include
> <exception> and <string>.
> (__cow_constexpr_string): New class if
> __cpp_lib_constexpr_exceptions >= 202502L.
> (__cow_string): In that case typedef to __cow_constexpr_string.
> (logic_error, domain_error, invalid_argument, length_error,
> out_of_range, runtime_error, range_error, overflow_error,
> underflow_error): If __cpp_lib_constexpr_exceptions >= 202502L
> make all cdtors and methods constexpr.
> * include/std/optional (__glibcxx_want_constexpr_exceptions): Define
> before including bits/version.h.
> (bad_optional_access::what): Make constexpr for
> __cpp_lib_constexpr_exceptions >= 202502L.
> (__throw_bad_optional_access): Likewise.
> * include/std/expected (__glibcxx_want_constexpr_exceptions): Define
> before including bits/version.h.
> (bad_expected_access): Make cdtors and all methods constexpr for
> __cpp_lib_constexpr_exceptions >= 202502L.
> * include/std/format (__glibcxx_want_constexpr_exceptions): Define
> before including bits/version.h.
> (_GLIBCXX_CONSTEXPR_FORMAT_ERROR): Define and undef later.
> (format_error): Use _GLIBCXX_CONSTEXPR_FORMAT_ERROR on ctors.
> * include/std/variant (__glibcxx_want_constexpr_exceptions): Define
> before including bits/version.h.
> (_GLIBCXX_CONSTEXPR_BAD_VARIANT_ACCESS): Define and undef later.
> (bad_variant_access): Use it on ctors and what() method.
> (__throw_bad_variant_access): Use it here too.
> * testsuite/18_support/exception/version.cc: Adjust expected
> __cpp_lib_constexpr_exceptions value.
> * testsuite/19_diagnostics/runtime_error/constexpr.cc: New test.
> * testsuite/19_diagnostics/headers/stdexcept/version.cc: New test.
> * testsuite/19_diagnostics/logic_error/constexpr.cc: New test.
> * testsuite/20_util/expected/observers.cc (test_value_throw): Change
> return type to bool from void, return true at the end, add test
> to dereference what() first character. Make it constexpr for
> __cpp_lib_constexpr_exceptions >= 202502L and add static_assert.
> * testsuite/20_util/expected/version.cc: Add tests for
> __cpp_lib_constexpr_exceptions value.
> * testsuite/20_util/variant/constexpr.cc: For
> __cpp_lib_constexpr_exceptions >= 202502L include <string>.
> (test_get): New function if __cpp_lib_constexpr_exceptions >= 202502L,
> assert calling it is true.
> * testsuite/20_util/variant/version.cc: Add tests for
> __cpp_lib_constexpr_exceptions value.
> * testsuite/20_util/optional/constexpr/observers/3.cc: Include
> testsuite_hooks.h.
> (eat, test01): New functions. Assert test01() is true.
> * testsuite/20_util/optional/version.cc: Add tests for
> __cpp_lib_constexpr_exceptions value.
> * include/std/future: Add #include <bits/functexcept.h>.
> * include/std/shared_mutex: Include <bits/new_throw.h>.
> * include/std/flat_map: Include <bits/stdexcept_throw.h> instead of
> <bits/functexcept.h>.
> * include/std/syncstream: Remove <bits/functexcept.h> include.
> * include/std/flat_set: Likewise.
> * include/std/bitset: Include <bits/stdexcept_throw.h> instead of
> <bits/functexcept.h>.
> * include/std/string_view: Don't include <bits/functexcept.h>, include
> <bits/stdexcept_throw.h> early if __glibcxx_exc_in_string is not
> defined and include <bits/stdexcept_throw.h> at the end of
> the header again if __glibcxx_exc_in_string is 2 and C++26 constexpr
> exceptions are enabled.
> (__glibcxx_exc_in_string): Define if __glibcxx_exc_in_string wasn't
> defined before including <bits/stdexcept_throw.h>.
> * include/std/array: Include <bits/stdexcept_throw.h> instead of
> <bits/functexcept.h>.
> * include/std/inplace_vector: Likewise.
> * include/std/string: Include <bits/stdexcept_except.h> and
> <bits/stdexcept_throw.h> after bits/basic_string.tcc include if
> C++26 constexpr exceptions are enabled and include
> <bits/stdexcept_throw.h> instead of <bits/functexcept.h> early.
> (__glibcxx_exc_in_string): Define early to 1, undefine at the end.
> * include/std/deque: Include <bits/stdexcept_throw.h>.
> * include/bits/new_allocator.h: Include <bits/new_throw.h> instead
> of <bits/functexcept.h>.
> * include/bits/stl_algobase.h: Remove <bits/functexcept.h> include.
> * include/bits/stl_vector.h: Include <bits/stdexcept_throw.h> instead
> of <bits/functexcept.h>.
> * include/bits/memory_resource.h: Include <bits/new_throw.h> instead
> of <bits/functexcept.h>.
> * include/bits/functexcept.h: Guard everything after includes with
> #if _GLIBCXX_HOSTED.
> (__throw_bad_exception, __throw_bad_alloc,
> __throw_bad_array_new_length, __throw_bad_cast, __throw_bad_typeid,
> __throw_logic_error, __throw_domain_error, __throw_invalid_argument,
> __throw_length_error, __throw_out_of_range, __throw_out_of_range_fmt,
> __throw_runtime_error, __throw_range_error, __throw_overflow_error,
> __throw_underflow_error): Move declarations to other headers
> - <bits/*_throw.h> and <bits/stdexcept_throwfwd.h>.
> * include/bits/stl_map.h: Include <bits/stdexcept_throw.h> instead
> of <bits/functexcept.h>.
> * include/bits/locale_classes.h: Include <bits/typeinfo_throw.h>.
> * include/bits/hashtable_policy.h: Include <bits/stdexcept_throw.h>
> instead of <bits/functexcept.h>.
> * include/bits/formatfwd.h (std::__throw_format_error): Remove
> declaration.
> * include/bits/specfun.h: Include <bits/stdexcept_throw.h> instead of
> <bits/functexcept.h>.
> * include/bits/basic_ios.h: Include <bits/typeinfo_throw.h>.
> * include/tr1/cmath: Include <bits/stdexcept_throw.h> instead of
> <bits/functexcept.h>.
> * include/tr1/memory: Remove <bits/functexcept.h> include.
> * include/tr1/array: Include <bits/stdexcept_throw.h>.
> * include/ext/vstring_util.h: Include <bits/stdexcept_throw.h> instead
> of <bits/functexcept.h>.
> * include/ext/bitmap_allocator.h: Include <bits/new_throw.h> instead
> of <bits/functexcept.h>.
> * include/ext/mt_allocator.h: Likewise.
> * include/ext/malloc_allocator.h: Likewise.
> * include/ext/debug_allocator.h: Include <bits/stdexcept_throw.h>
> instead of <bits/functexcept.h>.
> * include/ext/concurrence.h: Include <bits/exception_defines.h>
> instead of <bits/functexcept.h>.
> * include/ext/throw_allocator.h: Include <bits/new_throw.h> and
> <bits/stdexcept_throw.h> instead of <bits/functexcept.h>.
> * include/ext/string_conversions.h: Include <bits/stdexcept_throw.h>
> instead of <bits/functexcept.h>.
> * include/ext/pool_allocator.h: Include <bits/new_throw.h> instead
> of <bits/functexcept.h>.
> * include/ext/ropeimpl.h: Include <bits/stdexcept_throw.h> instead of
> <bits/functexcept.h>.
> * include/tr2/dynamic_bitset: Likewise.
> * include/experimental/optional: Include <bits/exception_defines.h>
> instead of <bits/functexcept.h>.
> * include/Makefile.am (bits_freestanding): Add
> ${bits_srcdir}/{exception,new,stdexcept,typeinfo}_{except,throw}.h
> and ${bits_srcdir}/stdexcept_throw{fwd,def}.h.
> * include/Makefile.in: Regenerate.
> * src/c++17/floating_from_chars.cc: Remove <bits/functexcept.h>
> include.
> * src/c++11/regex.cc: Likewise.
> * src/c++11/functexcept.cc: Likewise.
> * src/c++11/snprintf_lite.cc: Include <bits/stdexcept_throw.h> instead
> of <bits/functexcept.h>.
> * src/c++11/thread.cc: Include <bits/functexcept.h>.
> * testsuite/util/testsuite_shared.cc: Include <bits/exception_throw.h>
> instead of <bits/functexcept.h>.
> * testsuite/util/testsuite_hooks.h: Include <bits/stdexcept_throw.h>
> instead of <bits/functexcept.h>.
> * testsuite/util/io/verified_cmd_line_input.cc: Include
> <bits/exception_defines.h> instead of <bits/functexcept.h>.
> * testsuite/20_util/allocator/105975.cc: Expect different diagnostics
> for C++26.
> * testsuite/23_containers/inplace_vector/access/capacity.cc: Remove
> #error, guard if consteval { return; } with
> #ifndef __cpp_lib_constexpr_exceptions.
> * testsuite/23_containers/inplace_vector/access/elem.cc: Likewise.
> * testsuite/23_containers/inplace_vector/cons/1.cc: Likewise.
> * testsuite/23_containers/inplace_vector/cons/from_range.cc: Likewise.
> * testsuite/23_containers/inplace_vector/modifiers/single_insert.cc:
> Likewise.
> * testsuite/23_containers/inplace_vector/modifiers/assign.cc:
> Likewise.
> * testsuite/23_containers/inplace_vector/modifiers/multi_insert.cc:
> Likewise.
> * libsupc++/exception: Include <bits/exception_except.h>.
> (std::bad_exception): Move defintion to <bits/exception_except.h>.
> * libsupc++/new: Include <bits/new_except.h>.
> (std::bad_alloc, std::bad_array_new_length): Move defintion to
> <bits/new_except.h>.
> * libsupc++/typeinfo: Include <bits/typeinfo_except.h>.
> (std::bad_cast, std::bad_typeid): Move defintion to
> <bits/typeinfo_except.h>.
>libgomp/
> * omp.h.in: Include <bits/new_throw.h> instead of
> <bits/functexcept.h>.
>gcc/testsuite/
> * g++.dg/tree-ssa/pr110819.C: Guard scan-tree-dump-not delete on
> c++23_down and add comment explaining why C++26 fails that.
> * g++.dg/tree-ssa/pr96945.C: Likewise.
> * g++.dg/tree-ssa/pr109442.C: Likewise.
> * g++.dg/tree-ssa/pr116868.C: Likewise.
> * g++.dg/tree-ssa/pr58483.C: Likewise.
>
>--- libstdc++-v3/include/bits/version.def.jj 2025-09-04 10:37:06.591629137 +0200
>+++ libstdc++-v3/include/bits/version.def 2025-09-05 12:42:44.695156256 +0200
>@@ -2100,10 +2100,8 @@ ftms = {
>
> ftms = {
> name = constexpr_exceptions;
>- // TODO Remove when PR121114 is resolved
>- no_stdname = true;
> values = {
>- v = 1; // TODO 202411;
>+ v = 202502;
> cxxmin = 26;
> extra_cond = "__cpp_constexpr_exceptions >= 202411L";
> };
>--- libstdc++-v3/include/bits/version.h.jj 2025-09-04 10:37:06.604628964 +0200
>+++ libstdc++-v3/include/bits/version.h 2025-09-05 12:42:44.708156085 +0200
>@@ -2355,8 +2355,9 @@
>
> #if !defined(__cpp_lib_constexpr_exceptions)
> # if (__cplusplus > 202302L) && (__cpp_constexpr_exceptions >= 202411L)
>-# define __glibcxx_constexpr_exceptions 1L
>+# define __glibcxx_constexpr_exceptions 202502L
> # if defined(__glibcxx_want_all) || defined(__glibcxx_want_constexpr_exceptions)
>+# define __cpp_lib_constexpr_exceptions 202502L
> # endif
> # endif
> #endif /* !defined(__cpp_lib_constexpr_exceptions) && defined(__glibcxx_want_constexpr_exceptions) */
>--- libstdc++-v3/src/c++11/cow-stdexcept.cc.jj 2025-08-12 08:59:39.297115131 +0200
>+++ libstdc++-v3/src/c++11/cow-stdexcept.cc 2025-09-05 12:42:44.732155770 +0200
>@@ -126,18 +126,22 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
>
> __cow_string();
> __cow_string(const std::string& s);
>+ __cow_string(const char*);
> __cow_string(const char*, size_t n);
> __cow_string(const __cow_string&) noexcept;
> __cow_string& operator=(const __cow_string&) noexcept;
> ~__cow_string();
> __cow_string(__cow_string&&) noexcept;
> __cow_string& operator=(__cow_string&&) noexcept;
>+ const char* c_str() const noexcept;
> };
>
> __cow_string::__cow_string() : _M_str() { }
>
> __cow_string::__cow_string(const std::string& s) : _M_str(s) { }
>
>+ __cow_string::__cow_string(const char* s) : _M_str(s) { }
>+
> __cow_string::__cow_string(const char* s, size_t n) : _M_str(s, n) { }
>
> __cow_string::__cow_string(const __cow_string& s) noexcept
>@@ -162,6 +166,12 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
> return *this;
> }
>
>+ const char*
>+ __cow_string::c_str() const noexcept
>+ {
>+ return _M_str.c_str();
>+ }
>+
> static_assert(sizeof(__cow_string) == sizeof(std::string),
> "sizeof(std::string) has changed");
> static_assert(alignof(__cow_string) == alignof(std::string),
>--- libstdc++-v3/config/abi/pre/gnu.ver.jj 2025-08-28 10:08:44.878229207 +0200
>+++ libstdc++-v3/config/abi/pre/gnu.ver 2025-09-05 12:42:44.760155402 +0200
>@@ -2573,6 +2573,16 @@ GLIBCXX_3.4.35 {
> _ZN11__gnu_debug25_Safe_local_iterator_base16_M_attach_singleEPKNS_30_Safe_unordered_container_baseEb;
> _ZNK11__gnu_debug30_Safe_unordered_container_base13_M_detach_allEv;
> _ZNK11__gnu_debug30_Safe_unordered_container_base7_M_swapERKS0_;
>+
>+ # std::__cow_string
>+ _ZNSt12__cow_stringC2EPKc;
>+ _ZNSt12__cow_stringC2EPKc[jmy];
>+ _ZNSt12__cow_stringC2ERKS_;
>+ _ZNSt12__cow_stringC2EOS_;
>+ _ZNSt12__cow_stringD2Ev;
>+ _ZNSt12__cow_stringaSERKS_;
>+ _ZNSt12__cow_stringaSEOS_;
>+ _ZNKSt12__cow_string5c_strEv;
> } GLIBCXX_3.4.34;
>
> # Symbols in the support library (libsupc++) have their own tag.
>--- libstdc++-v3/include/bits/exception_except.h.jj 2025-09-05 12:44:22.865867854 +0200
>+++ libstdc++-v3/include/bits/exception_except.h 2025-09-05 13:52:51.529915345 +0200
>@@ -0,0 +1,83 @@
>+// Exception classes for <exception> -*- C++ -*-
Let's say "Definition of std::bad_exception"
>+
>+// Copyright (C) 2001-2025 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
>+// <http://www.gnu.org/licenses/>.
>+
>+/** @file bits/exception_except.h
>+ * This is an internal header file, included by other library headers.
>+ * Do not attempt to use it directly. @headername{exception}
>+ *
>+ * This header provides support for -fno-exceptions.
This line was copied from functexcept.h but is not accurate here -
just remove it?
>+ */
>+
>+//
>+// ISO C++ 14882: 19.1 Exception classes
>+//
>+
>+#ifndef _EXCEPTION_EXCEPT_H
>+#define _EXCEPTION_EXCEPT_H 1
>+
>+#include <bits/c++config.h>
>+#include <bits/exception_defines.h>
>+#include <bits/exception.h>
>+
>+extern "C++"
>+{
>+
>+namespace std _GLIBCXX_VISIBILITY(default)
>+{
>+_GLIBCXX_BEGIN_NAMESPACE_VERSION
>+
>+ /** If an %exception is thrown which is not listed in a function's
>+ * %exception specification, one of these may be thrown.
That was true until C++14 but then dynamic exception specifications
were removed in C++17. In current standards, std::bad_exception is
only thrown by the library if std::current_exception() tries to copy
the active exception (which never happens in the Itanium ABI, only the
Microsoft ABI) and the exceptions copy ctor throws.
Let's take the opportunity to update this comment:
/** @brief std::bad_exception
*
* In C++14 and earlier standards, `std::bad_exception` is thrown by the
* runtime when `std::unexpected()` exits with an exception that is
* not allowed by a function's dynamic exception specification.
*
* Since C++17, `std::bad_exception` is only used during a call to
* `std::current_exception()` if the active exception needs to be
* copied but copying it fails with an exception. For the Itanium
* ABI used by libstdc++, the active exception never needs to be
* copied, so `std::bad_exception` is unused.
*
* @ingroup exceptions
*/
>+ *
>+ * @ingroup exceptions
>+ */
>+ class bad_exception : public exception
>+ {
>+ public:
>+ _GLIBCXX26_CONSTEXPR bad_exception() _GLIBCXX_USE_NOEXCEPT { }
>+
>+#if __cplusplus >= 202400L
>+ constexpr virtual ~bad_exception() _GLIBCXX_TXN_SAFE_DYN noexcept {}
>+
>+ constexpr virtual const char* what() const _GLIBCXX_TXN_SAFE_DYN noexcept
>+ {
>+ return "std::bad_exception";
>+ }
>+#else
>+ // This declaration is not useless:
>+ // http://gcc.gnu.org/onlinedocs/gcc-3.0.2/gcc_6.html#SEC118
>+ virtual ~bad_exception() _GLIBCXX_TXN_SAFE_DYN _GLIBCXX_USE_NOEXCEPT;
>+
>+ // See comment in eh_exception.cc.
>+ virtual const char*
>+ what() const _GLIBCXX_TXN_SAFE_DYN _GLIBCXX_USE_NOEXCEPT;
>+#endif
>+ };
>+
>+_GLIBCXX_END_NAMESPACE_VERSION
>+} // namespace
>+
>+}
>+
>+#endif
>--- libstdc++-v3/include/bits/exception_throw.h.jj 2025-09-05 12:44:25.977827010 +0200
>+++ libstdc++-v3/include/bits/exception_throw.h 2025-09-05 12:57:27.871565351 +0200
>@@ -0,0 +1,68 @@
>+// Function-Based Exception Support -*- C++ -*-
>+
>+// Copyright (C) 2001-2025 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
>+// <http://www.gnu.org/licenses/>.
>+
>+/** @file bits/exception_throw.h
>+ * This is an internal header file, included by other library headers.
>+ * Do not attempt to use it directly. @headername{exception}
>+ *
>+ * This header provides support for -fno-exceptions.
>+ */
>+
>+//
>+// ISO C++ 14882: 19.1 Exception classes
>+//
>+
>+#ifndef _EXCEPTION_THROW_H
>+#define _EXCEPTION_THROW_H 1
>+
>+#include <bits/c++config.h>
>+#include <bits/exception_defines.h>
>+#if (_GLIBCXX_HOSTED && __cpp_exceptions && __cplusplus > 202302L \
>+ && __cpp_constexpr_exceptions >= 202411L)
>+#include <bits/exception_except.h>
>+#endif
>+
>+namespace std _GLIBCXX_VISIBILITY(default)
>+{
>+_GLIBCXX_BEGIN_NAMESPACE_VERSION
>+
>+#if _GLIBCXX_HOSTED
>+#if (__cpp_exceptions && __cplusplus > 202302L \
>+ && __cpp_constexpr_exceptions >= 202411L)
>+ // Helper for exception objects in <exception>
>+ [[noreturn, __gnu__::__always_inline__]] constexpr void
>+ __throw_bad_exception(void)
>+ {
>+ throw bad_exception();
>+ }
Given what I wrote above, do we ever need this during constant
evaluation? The library never calls it, and users should not call this
function (they should just throw the exception directly). I think we
can omit this.
And so maybe we don't need this header at all, nor the new header for
bad_exception? (and if that's true, don't worry about updating the
comment for bad_exception, I can do that separately).
>+#else
>+ // Helper for exception objects in <exception>
>+ void __throw_bad_exception(void) __attribute__((__noreturn__));
>+#endif
>+#endif // HOSTED
>+
>+_GLIBCXX_END_NAMESPACE_VERSION
>+} // namespace
>+
>+#endif
>--- libstdc++-v3/include/bits/new_except.h.jj 2025-09-05 12:44:22.865867854 +0200
>+++ libstdc++-v3/include/bits/new_except.h 2025-09-05 13:53:11.698650548 +0200
>@@ -0,0 +1,112 @@
>+// Exception classes for <new> -*- C++ -*-
>+
>+// Copyright (C) 2001-2025 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
>+// <http://www.gnu.org/licenses/>.
>+
>+/** @file bits/new_except.h
>+ * This is an internal header file, included by other library headers.
>+ * Do not attempt to use it directly. @headername{new}
>+ *
>+ * This header provides support for -fno-exceptions.
Not accurate here
>+ */
>+
>+//
>+// ISO C++ 14882: 19.1 Exception classes
>+//
>+
>+#ifndef _NEW_EXCEPT_H
>+#define _NEW_EXCEPT_H 1
>+
>+#include <bits/c++config.h>
>+#include <bits/exception_defines.h>
>+#include <bits/exception.h>
>+
>+extern "C++"
>+{
>+
>+namespace std _GLIBCXX_VISIBILITY(default)
>+{
>+_GLIBCXX_BEGIN_NAMESPACE_VERSION
>+
>+ /**
>+ * @brief Exception possibly thrown by @c new.
>+ * @ingroup exceptions
>+ *
>+ * @c bad_alloc (or classes derived from it) is used to report allocation
>+ * errors from the throwing forms of @c new. */
>+ class bad_alloc : public exception
>+ {
>+ public:
>+ _GLIBCXX26_CONSTEXPR bad_alloc() throw() { }
>+
>+#if __cplusplus >= 201103L
>+ _GLIBCXX26_CONSTEXPR bad_alloc(const bad_alloc&) = default;
>+ _GLIBCXX26_CONSTEXPR bad_alloc& operator=(const bad_alloc&) = default;
>+#endif
>+
>+#if __cplusplus >= 202400L
>+ constexpr virtual ~bad_alloc() noexcept {}
>+
>+ constexpr virtual const char* what() const noexcept
>+ {
>+ return "std::bad_alloc";
>+ }
>+#else
>+ // This declaration is not useless:
>+ // http://gcc.gnu.org/onlinedocs/gcc-3.0.2/gcc_6.html#SEC118
>+ virtual ~bad_alloc() throw();
>+
>+ // See comment in eh_exception.cc.
>+ virtual const char* what() const throw();
>+#endif
>+ };
>+
>+#if __cplusplus >= 201103L
>+ class bad_array_new_length : public bad_alloc
>+ {
>+ public:
>+ _GLIBCXX26_CONSTEXPR bad_array_new_length() throw() { }
>+
>+#if __cplusplus >= 202400L
>+ constexpr virtual ~bad_array_new_length() noexcept {}
>+
>+ constexpr virtual const char* what() const noexcept
>+ {
>+ return "std::bad_array_new_length";
>+ }
>+#else
>+ // This declaration is not useless:
>+ // http://gcc.gnu.org/onlinedocs/gcc-3.0.2/gcc_6.html#SEC118
>+ virtual ~bad_array_new_length() throw();
>+
>+ // See comment in eh_exception.cc.
>+ virtual const char* what() const throw();
>+#endif
>+ };
>+#endif
>+
>+_GLIBCXX_END_NAMESPACE_VERSION
>+} // namespace
>+
>+}
>+
>+#endif
>--- libstdc++-v3/include/bits/new_throw.h.jj 2025-09-05 12:44:25.977827010 +0200
>+++ libstdc++-v3/include/bits/new_throw.h 2025-09-05 13:48:18.452500227 +0200
>@@ -0,0 +1,78 @@
>+// Function-Based Exception Support -*- C++ -*-
>+
>+// Copyright (C) 2001-2025 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
>+// <http://www.gnu.org/licenses/>.
>+
>+/** @file bits/new_throw.h
>+ * This is an internal header file, included by other library headers.
>+ * Do not attempt to use it directly. @headername{new}
>+ *
>+ * This header provides support for -fno-exceptions.
>+ */
>+
>+//
>+// ISO C++ 14882: 19.1 Exception classes
>+//
>+
>+#ifndef _NEW_THROW_H
>+#define _NEW_THROW_H 1
>+
>+#include <bits/c++config.h>
>+#include <bits/exception_defines.h>
>+#if (_GLIBCXX_HOSTED && __cpp_exceptions && __cplusplus > 202302L \
>+ && __cpp_constexpr_exceptions >= 202411L)
>+#include <bits/new_except.h>
>+#endif
>+
>+namespace std _GLIBCXX_VISIBILITY(default)
>+{
>+_GLIBCXX_BEGIN_NAMESPACE_VERSION
>+
>+#if _GLIBCXX_HOSTED
>+#if (__cpp_exceptions && __cplusplus > 202302L \
>+ && __cpp_constexpr_exceptions >= 202411L)
>+ // Helper for exception objects in <new>
>+ [[noreturn, __gnu__::__always_inline__]] constexpr void
>+ __throw_bad_alloc(void)
>+ {
>+ throw bad_alloc();
>+ }
>+
>+ [[noreturn, __gnu__::__always_inline__]] constexpr void
>+ __throw_bad_array_new_length(void)
>+ {
>+ throw bad_array_new_length();
>+ }
>+#else
>+ // Helper for exception objects in <new>
>+ void
>+ __throw_bad_alloc(void) __attribute__((__noreturn__));
>+
>+ void
>+ __throw_bad_array_new_length(void) __attribute__((__noreturn__));
>+#endif
>+#endif // HOSTED
>+
>+_GLIBCXX_END_NAMESPACE_VERSION
>+} // namespace
>+
>+#endif
>--- libstdc++-v3/include/bits/stdexcept_except.h.jj 2025-09-05 12:42:45.368147423 +0200
>+++ libstdc++-v3/include/bits/stdexcept_except.h 2025-09-05 15:08:04.444602129 +0200
>@@ -0,0 +1,579 @@
>+// Exception classes for <stdexcept> -*- C++ -*-
>+
>+// Copyright (C) 2001-2025 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
>+// <http://www.gnu.org/licenses/>.
>+
>+/** @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 <exception>
>+#include <string>
>+
>+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;
Are these names correct for Darwin? I think it might need an extra
underscore at the start?
>+ }
>+ } // 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
I'm sorry this is so complicated ;-(
>+ {
>+ 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<char> __sso_string;
>+#else // _GLIBCXX_USE_CXX11_ABI
>+ typedef basic_string<char> __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<char> __sso_string;
>+ typedef basic_string<char> __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
>+ constexpr explicit
>+ logic_error(const string& __arg) _GLIBCXX_TXN_SAFE
>+ : _M_msg(__arg) {}
>+
>+ constexpr 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;
>+
>+ constexpr virtual ~logic_error() _GLIBCXX_TXN_SAFE_DYN noexcept { }
>+
>+ constexpr 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
>+ constexpr explicit domain_error(const string& __arg) _GLIBCXX_TXN_SAFE
>+ : logic_error(__arg) { }
>+ constexpr 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;
>+ constexpr virtual ~domain_error() _GLIBCXX_NOTHROW { }
>+#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
>+ constexpr explicit invalid_argument(const string& __arg) _GLIBCXX_TXN_SAFE
>+ : logic_error(__arg) { }
>+ constexpr 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;
>+ constexpr virtual ~invalid_argument() _GLIBCXX_NOTHROW { }
>+#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
>+ constexpr explicit length_error(const string& __arg) _GLIBCXX_TXN_SAFE
>+ : logic_error(__arg) { }
>+ constexpr 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;
>+ constexpr virtual ~length_error() _GLIBCXX_NOTHROW { }
>+#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
>+ constexpr explicit out_of_range(const string& __arg) _GLIBCXX_TXN_SAFE
>+ : logic_error(__arg) { }
>+ constexpr 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;
>+ constexpr virtual ~out_of_range() _GLIBCXX_NOTHROW { }
>+#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
>+ constexpr explicit
>+ runtime_error(const string& __arg) _GLIBCXX_TXN_SAFE
>+ : _M_msg(__arg) {}
>+
>+ constexpr 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;
>+
>+ constexpr virtual ~runtime_error() _GLIBCXX_TXN_SAFE_DYN noexcept { }
>+
>+ constexpr 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 range errors in internal computations. */
>+ class range_error : public runtime_error
>+ {
>+ public:
>+#if __cpp_lib_constexpr_exceptions >= 202502L
>+ constexpr explicit range_error(const string& __arg) _GLIBCXX_TXN_SAFE
>+ : runtime_error(__arg) { }
>+ constexpr explicit range_error(const char* __arg) _GLIBCXX_TXN_SAFE
>+ : runtime_error(__arg) { }
>+ constexpr range_error(const range_error&) = default;
>+ constexpr range_error& operator=(const range_error&) = default;
>+ constexpr range_error(range_error&&) = default;
>+ constexpr range_error& operator=(range_error&&) = default;
>+ constexpr virtual ~range_error() noexcept { }
>+#else
>+ explicit range_error(const string& __arg) _GLIBCXX_TXN_SAFE;
>+#if __cplusplus >= 201103L
>+ explicit range_error(const char*) _GLIBCXX_TXN_SAFE;
>+ range_error(const range_error&) = default;
>+ range_error& operator=(const range_error&) = default;
>+ range_error(range_error&&) = default;
>+ range_error& operator=(range_error&&) = default;
>+#endif
>+ virtual ~range_error() _GLIBCXX_NOTHROW;
>+#endif
>+ };
>+
>+ /** Thrown to indicate arithmetic overflow. */
>+ class overflow_error : public runtime_error
>+ {
>+ public:
>+#if __cpp_lib_constexpr_exceptions >= 202502L
>+ constexpr explicit overflow_error(const string& __arg) _GLIBCXX_TXN_SAFE
>+ : runtime_error(__arg) { }
>+ constexpr 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;
>+ constexpr 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
>+ constexpr explicit underflow_error(const string& __arg) _GLIBCXX_TXN_SAFE
>+ : runtime_error(__arg) { }
>+ constexpr 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;
>+ constexpr 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 */
>--- libstdc++-v3/include/bits/stdexcept_throw.h.jj 2025-09-05 14:10:33.044977172 +0200
>+++ libstdc++-v3/include/bits/stdexcept_throw.h 2025-09-05 14:36:21.317638306 +0200
>@@ -0,0 +1,63 @@
>+// Function-Based Exception Support -*- C++ -*-
>+
>+// Copyright (C) 2001-2025 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
>+// <http://www.gnu.org/licenses/>.
>+
>+/** @file bits/stdexcept_throw.h
>+ * This is an internal header file, included by other library headers.
>+ * Do not attempt to use it directly. @headername{stdexcept}
>+ *
>+ * This header provides support for -fno-exceptions.
>+ */
>+
>+//
>+// ISO C++ 14882: 19.1 Exception classes
>+//
>+
>+#include <bits/c++config.h>
>+#include <bits/exception_defines.h>
>+
>+#if (_GLIBCXX_HOSTED && __cpp_exceptions && __cplusplus > 202302L \
>+ && __cpp_constexpr_exceptions >= 202411L)
>+// This is a complicated case. Classes like std::logic_error
>+// are defined in <stdexcept> but need std::string and <string>
>+// needs __throw_logic_error and a few others. So, for C++26
>+// constant expression we need to forward declare the constexpr
>+// __throw_logic_error etc. functions when included recursively
>+// from <string> and then at the end of that header make sure
>+// <stdexcept> is included and define those.
>+// If <string> hasn't been included yet, include it at the end
>+// of this header and that will arrange for all these to be
>+// defined.
>+#if defined(_GLIBCXX_STRING) || __glibcxx_exc_in_string == 2
>+#ifdef __glibcxx_exc_in_string
>+#include <bits/stdexcept_throwfwd.h>
>+#else
>+#include <bits/stdexcept_throwdef.h>
>+#endif
>+#endif
>+#if !defined(_GLIBCXX_STRING) && __glibcxx_exc_in_string != 2
>+#include <string>
>+#endif
>+#else
>+#include <bits/stdexcept_throwfwd.h>
>+#endif
>--- libstdc++-v3/include/bits/stdexcept_throwdef.h.jj 2025-09-05 13:58:44.504281164 +0200
>+++ libstdc++-v3/include/bits/stdexcept_throwdef.h 2025-09-05 15:39:19.190054316 +0200
>@@ -0,0 +1,192 @@
>+// Function-Based Exception Support -*- C++ -*-
>+
>+// Copyright (C) 2001-2025 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
>+// <http://www.gnu.org/licenses/>.
>+
>+/** @file bits/exception_throwdef.h
>+ * This is an internal header file, included by other library headers.
>+ * Do not attempt to use it directly. @headername{stdexcept}
>+ *
>+ * This header provides support for -fno-exceptions.
>+ */
>+
>+//
>+// ISO C++ 14882: 19.1 Exception classes
>+//
>+
>+#ifndef _STDEXCEPT_THROWDEF_H
>+#define _STDEXCEPT_THROWDEF_H 1
>+
>+#include <bits/c++config.h>
>+#include <bits/exception_defines.h>
>+#if (_GLIBCXX_HOSTED && __cpp_exceptions && __cplusplus > 202302L \
>+ && __cpp_constexpr_exceptions >= 202411L)
>+
>+namespace std _GLIBCXX_VISIBILITY(default)
>+{
>+_GLIBCXX_BEGIN_NAMESPACE_VERSION
>+
>+ // Helpers for exception objects in <stdexcept>
>+ namespace __detail
>+ {
>+ extern "C"
>+ {
>+ [[noreturn, __gnu__::__cold__]] void
>+ _ZSt19__throw_logic_errorPKc(const char*);
>+
>+ [[noreturn, __gnu__::__cold__]] void
>+ _ZSt20__throw_domain_errorPKc(const char*);
>+
>+ [[noreturn, __gnu__::__cold__]] void
>+ _ZSt24__throw_invalid_argumentPKc(const char*);
>+
>+ [[noreturn, __gnu__::__cold__]] void
>+ _ZSt20__throw_length_errorPKc(const char*);
>+
>+ [[noreturn, __gnu__::__cold__]] void
>+ _ZSt20__throw_out_of_rangePKc(const char*);
>+
>+ [[noreturn, __gnu__::__cold__]]
>+ [[__gnu__::__format__(__gnu_printf__, 1, 2)]] void
>+ _ZSt24__throw_out_of_range_fmtPKcz(const char*, ...);
>+
>+ [[noreturn, __gnu__::__cold__]] void
>+ _ZSt21__throw_runtime_errorPKc(const char*);
>+
>+ [[noreturn, __gnu__::__cold__]] void
>+ _ZSt19__throw_range_errorPKc(const char*);
>+
>+ [[noreturn, __gnu__::__cold__]] void
>+ _ZSt22__throw_overflow_errorPKc(const char*);
>+
>+ [[noreturn, __gnu__::__cold__]] void
>+ _ZSt23__throw_underflow_errorPKc(const char*);
>+ }
>+ } // namespace __detail
>+
>+ [[noreturn, __gnu__::__always_inline__, __gnu__::__cold__]] constexpr void
>+ __throw_logic_error(const char* __s)
>+ {
>+ if consteval {
>+ throw logic_error(__s);
>+ } else {
>+ __detail::_ZSt19__throw_logic_errorPKc(__s);
>+ }
>+ }
>+
>+ [[noreturn, __gnu__::__always_inline__, __gnu__::__cold__]] constexpr void
>+ __throw_domain_error(const char* __s)
>+ {
>+ if consteval {
>+ throw domain_error(__s);
>+ } else {
>+ __detail::_ZSt20__throw_domain_errorPKc(__s);
>+ }
>+ }
>+
>+ [[noreturn, __gnu__::__always_inline__, __gnu__::__cold__]] constexpr void
>+ __throw_invalid_argument(const char* __s)
>+ {
>+ if consteval {
>+ throw invalid_argument(__s);
>+ } else {
>+ __detail::_ZSt24__throw_invalid_argumentPKc(__s);
>+ }
>+ }
>+
>+ [[noreturn, __gnu__::__always_inline__, __gnu__::__cold__]] constexpr void
>+ __throw_length_error(const char* __s)
>+ {
>+ if consteval {
>+ throw length_error(__s);
>+ } else {
>+ __detail::_ZSt20__throw_length_errorPKc(__s);
>+ }
>+ }
>+
>+ [[noreturn, __gnu__::__always_inline__, __gnu__::__cold__]] constexpr void
>+ __throw_out_of_range(const char* __s)
>+ {
>+ if consteval {
>+ throw out_of_range(__s);
>+ } else {
>+ __detail::_ZSt20__throw_out_of_rangePKc(__s);
>+ }
>+ }
>+
>+ template <typename... _Args>
>+ [[noreturn, __gnu__::__always_inline__, __gnu__::__cold__]] constexpr void
>+ __throw_out_of_range_fmt(const char* __s, _Args... __args)
>+ {
>+ if consteval {
>+ throw out_of_range(__s);
>+ } else {
>+ __detail::_ZSt24__throw_out_of_range_fmtPKcz(__s, __args...);
>+ }
>+ }
>+
>+ [[noreturn, __gnu__::__always_inline__, __gnu__::__cold__]] constexpr void
>+ __throw_runtime_error(const char* __s)
>+ {
>+ if consteval {
>+ throw runtime_error(__s);
>+ } else {
>+ __detail::_ZSt21__throw_runtime_errorPKc(__s);
>+ }
>+ }
>+
>+ [[noreturn, __gnu__::__always_inline__, __gnu__::__cold__]] constexpr void
>+ __throw_range_error(const char* __s)
>+ {
>+ if consteval {
>+ throw range_error(__s);
>+ } else {
>+ __detail::_ZSt19__throw_range_errorPKc(__s);
>+ }
>+ }
It looks like nothing ever calls __throw_range_error except
std::wstring_convert and std::wstring_buffer, and those were removed
in C++26 and will never be constexpr.
So we don't really need to do this trickery for __throw_range_error.
>+
>+ [[noreturn, __gnu__::__always_inline__, __gnu__::__cold__]] constexpr void
>+ __throw_overflow_error(const char* __s)
>+ {
>+ if consteval {
>+ throw overflow_error(__s);
>+ } else {
>+ __detail::_ZSt22__throw_overflow_errorPKc(__s);
>+ }
>+ }
>+
>+ [[noreturn, __gnu__::__always_inline__, __gnu__::__cold__]] constexpr void
>+ __throw_underflow_error(const char* __s)
>+ {
>+ if consteval {
>+ throw underflow_error(__s);
>+ } else {
>+ __detail::_ZSt23__throw_underflow_errorPKc(__s);
>+ }
>+ }
>+
>+_GLIBCXX_END_NAMESPACE_VERSION
>+} // namespace
>+
>+#endif
>+
>+#endif
>--- libstdc++-v3/include/bits/stdexcept_throwfwd.h.jj 2025-09-05 13:59:03.688029296 +0200
>+++ libstdc++-v3/include/bits/stdexcept_throwfwd.h 2025-09-05 15:36:12.080508888 +0200
>@@ -0,0 +1,132 @@
>+// Function-Based Exception Support -*- C++ -*-
>+
>+// Copyright (C) 2001-2025 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
>+// <http://www.gnu.org/licenses/>.
>+
>+/** @file bits/stdexcept_throwfwd.h
>+ * This is an internal header file, included by other library headers.
>+ * Do not attempt to use it directly. @headername{stdexcept}
>+ *
>+ * This header provides support for -fno-exceptions.
>+ */
>+
>+//
>+// ISO C++ 14882: 19.1 Exception classes
>+//
>+
>+#ifndef _STDEXCEPT_THROWFWD_H
>+#define _STDEXCEPT_THROWFWD_H 1
>+
>+#include <bits/c++config.h>
>+#include <bits/exception_defines.h>
>+
>+namespace std _GLIBCXX_VISIBILITY(default)
>+{
>+_GLIBCXX_BEGIN_NAMESPACE_VERSION
>+
>+#if _GLIBCXX_HOSTED
>+#if (__cpp_exceptions && __cplusplus > 202302L \
>+ && __cpp_constexpr_exceptions >= 202411L)
>+ // Helper for exception objects in <stdexcept>
>+ [[noreturn, __gnu__::__always_inline__, __gnu__::__cold__]] constexpr void
>+ __throw_logic_error(const char*);
>+ [[noreturn, __gnu__::__always_inline__, __gnu__::__cold__]] constexpr void
>+ __throw_domain_error(const char*);
>+ [[noreturn, __gnu__::__always_inline__, __gnu__::__cold__]] constexpr void
>+ __throw_invalid_argument(const char*);
>+ [[noreturn, __gnu__::__always_inline__, __gnu__::__cold__]] constexpr void
>+ __throw_length_error(const char*);
>+ [[noreturn, __gnu__::__always_inline__, __gnu__::__cold__]] constexpr void
>+ __throw_out_of_range(const char*);
>+ template <typename... _Args>
>+ [[noreturn, __gnu__::__always_inline__, __gnu__::__cold__]] constexpr void
>+ __throw_out_of_range_fmt(const char* __s, _Args... __args);
>+ [[noreturn, __gnu__::__always_inline__, __gnu__::__cold__]] constexpr void
>+ __throw_runtime_error(const char*);
>+ [[noreturn, __gnu__::__always_inline__, __gnu__::__cold__]] constexpr void
>+ __throw_range_error(const char*);
>+ [[noreturn, __gnu__::__always_inline__, __gnu__::__cold__]] constexpr void
>+ __throw_overflow_error(const char*);
>+ [[noreturn, __gnu__::__always_inline__, __gnu__::__cold__]] constexpr void
>+ __throw_underflow_error(const char*);
>+#else
>+ // Helpers for exception objects in <stdexcept>
>+ void
>+ __throw_logic_error(const char*) __attribute__((__noreturn__,__cold__));
>+
>+ void
>+ __throw_domain_error(const char*) __attribute__((__noreturn__,__cold__));
>+
>+ void
>+ __throw_invalid_argument(const char*) __attribute__((__noreturn__,__cold__));
>+
>+ void
>+ __throw_length_error(const char*) __attribute__((__noreturn__,__cold__));
>+
>+ void
>+ __throw_out_of_range(const char*) __attribute__((__noreturn__,__cold__));
>+
>+ void
>+ __throw_out_of_range_fmt(const char*, ...)
>+ __attribute__((__noreturn__,__cold__,__format__(__gnu_printf__, 1, 2)));
>+
>+ void
>+ __throw_runtime_error(const char*) __attribute__((__noreturn__,__cold__));
>+
>+ void
>+ __throw_range_error(const char*) __attribute__((__noreturn__,__cold__));
>+
>+ void
>+ __throw_overflow_error(const char*) __attribute__((__noreturn__,__cold__));
>+
>+ void
>+ __throw_underflow_error(const char*) __attribute__((__noreturn__,__cold__));
>+#endif
>+
>+#else // ! HOSTED
>+
>+ __attribute__((__noreturn__)) inline void
>+ __throw_invalid_argument(const char*)
>+ { std::__terminate(); }
>+
>+ __attribute__((__noreturn__)) inline void
>+ __throw_out_of_range(const char*)
>+ { std::__terminate(); }
>+
>+ __attribute__((__noreturn__)) inline void
>+ __throw_out_of_range_fmt(const char*, ...)
>+ { std::__terminate(); }
>+
>+ __attribute__((__noreturn__)) inline void
>+ __throw_runtime_error(const char*)
>+ { std::__terminate(); }
>+
>+ __attribute__((__noreturn__)) inline void
>+ __throw_overflow_error(const char*)
>+ { std::__terminate(); }
>+
>+#endif // HOSTED
>+
>+_GLIBCXX_END_NAMESPACE_VERSION
>+} // namespace
>+
>+#endif
>--- libstdc++-v3/include/bits/typeinfo_except.h.jj 2025-09-05 12:44:22.865867854 +0200
>+++ libstdc++-v3/include/bits/typeinfo_except.h 2025-09-05 13:53:26.786452461 +0200
>@@ -0,0 +1,109 @@
>+// Exception classes for <typeinfo> -*- C++ -*-
>+
>+// Copyright (C) 2001-2025 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
>+// <http://www.gnu.org/licenses/>.
>+
>+/** @file bits/typeinfo_except.h
>+ * This is an internal header file, included by other library headers.
>+ * Do not attempt to use it directly. @headername{typeinfo}
>+ *
>+ * This header provides support for -fno-exceptions.
>+ */
>+
>+//
>+// ISO C++ 14882: 19.1 Exception classes
>+//
>+
>+#ifndef _TYPEINFO_EXCEPT_H
>+#define _TYPEINFO_EXCEPT_H 1
>+
>+#include <bits/c++config.h>
>+#include <bits/exception_defines.h>
>+#include <bits/exception.h>
>+
>+extern "C++"
>+{
>+
>+namespace std _GLIBCXX_VISIBILITY(default)
>+{
>+_GLIBCXX_BEGIN_NAMESPACE_VERSION
>+
>+ /**
>+ * @brief Thrown during incorrect typecasting.
>+ * @ingroup exceptions
>+ *
>+ * If you attempt an invalid @c dynamic_cast expression, an instance of
>+ * this class (or something derived from this class) is thrown. */
>+ class bad_cast : public exception
>+ {
>+ public:
>+ _GLIBCXX26_CONSTEXPR bad_cast() _GLIBCXX_USE_NOEXCEPT { }
>+
>+#if __cplusplus >= 202400L
>+ constexpr virtual ~bad_cast() noexcept {}
>+
>+ constexpr virtual const char* what() const noexcept
>+ {
>+ return "std::bad_cast";
>+ }
>+#else
>+ // This declaration is not useless:
>+ // http://gcc.gnu.org/onlinedocs/gcc-3.0.2/gcc_6.html#SEC118
>+ virtual ~bad_cast() _GLIBCXX_USE_NOEXCEPT;
>+
>+ // See comment in eh_exception.cc.
>+ virtual const char* what() const _GLIBCXX_USE_NOEXCEPT;
>+#endif
>+ };
>+
>+ /**
>+ * @brief Thrown when a NULL pointer in a @c typeid expression is used.
>+ * @ingroup exceptions
>+ */
>+ class bad_typeid : public exception
>+ {
>+ public:
>+ _GLIBCXX26_CONSTEXPR bad_typeid () _GLIBCXX_USE_NOEXCEPT { }
>+
>+#if __cplusplus >= 202400L
>+ constexpr virtual ~bad_typeid() noexcept {}
>+
>+ constexpr virtual const char* what() const noexcept
>+ {
>+ return "std::bad_typeid";
>+ }
>+#else
>+ // This declaration is not useless:
>+ // http://gcc.gnu.org/onlinedocs/gcc-3.0.2/gcc_6.html#SEC118
>+ virtual ~bad_typeid() _GLIBCXX_USE_NOEXCEPT;
>+
>+ // See comment in eh_exception.cc.
>+ virtual const char* what() const _GLIBCXX_USE_NOEXCEPT;
>+#endif
>+ };
>+
>+_GLIBCXX_END_NAMESPACE_VERSION
>+} // namespace
>+
>+}
>+
>+#endif
>--- libstdc++-v3/include/bits/typeinfo_throw.h.jj 2025-09-05 12:44:25.977827010 +0200
>+++ libstdc++-v3/include/bits/typeinfo_throw.h 2025-09-05 13:47:47.257909710 +0200
>@@ -0,0 +1,78 @@
>+// Function-Based Exception Support -*- C++ -*-
>+
>+// Copyright (C) 2001-2025 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
>+// <http://www.gnu.org/licenses/>.
>+
>+/** @file bits/typeinfo_throw.h
>+ * This is an internal header file, included by other library headers.
>+ * Do not attempt to use it directly. @headername{typeinfo}
>+ *
>+ * This header provides support for -fno-exceptions.
>+ */
>+
>+//
>+// ISO C++ 14882: 19.1 Exception classes
>+//
>+
>+#ifndef _TYPEINFO_THROW_H
>+#define _TYPEINFO_THROW_H 1
>+
>+#include <bits/c++config.h>
>+#include <bits/exception_defines.h>
>+#if (_GLIBCXX_HOSTED && __cpp_exceptions && __cplusplus > 202302L \
>+ && __cpp_constexpr_exceptions >= 202411L)
>+#include <bits/typeinfo_except.h>
>+#endif
>+
>+namespace std _GLIBCXX_VISIBILITY(default)
>+{
>+_GLIBCXX_BEGIN_NAMESPACE_VERSION
>+
>+#if _GLIBCXX_HOSTED
>+#if (__cpp_exceptions && __cplusplus > 202302L \
>+ && __cpp_constexpr_exceptions >= 202411L)
>+ // Helper for exception objects in <typeinfo>
>+ [[noreturn, __gnu__::__always_inline__, __gnu__::__cold__]] constexpr void
>+ __throw_bad_cast(void)
>+ {
>+ throw bad_cast();
>+ }
>+
>+ [[noreturn, __gnu__::__always_inline__, __gnu__::__cold__]] constexpr void
>+ __throw_bad_typeid(void)
>+ {
>+ throw bad_typeid();
>+ }
I don't think these are ever needed during consteval either.
__throw_bad_cast is only used by locales (and by iostreams when using
locales), and those are not usable in constant expressions (and
hopefully never will be!)
__throw_bad_typeid seems to never be used anywhere! Maybe we should
just remove the declaration from functexcept.h (but continue to export
the definition from the library because the symbol must be kept).
>+#else
>+ // Helper for exception objects in <typeinfo>
>+ void
>+ __throw_bad_cast(void) __attribute__((__noreturn__,__cold__));
>+
>+ void
>+ __throw_bad_typeid(void) __attribute__((__noreturn__,__cold__));
>+#endif
>+#endif // HOSTED
>+
>+_GLIBCXX_END_NAMESPACE_VERSION
>+} // namespace
>+
>+#endif
>--- libstdc++-v3/include/std/stdexcept.jj 2025-08-12 08:59:39.275115423 +0200
>+++ libstdc++-v3/include/std/stdexcept 2025-09-06 03:25:48.625504148 +0200
>@@ -39,271 +39,6 @@
>
> #include <exception>
> #include <string>
>-
>-namespace std _GLIBCXX_VISIBILITY(default)
>-{
>-_GLIBCXX_BEGIN_NAMESPACE_VERSION
>-
>-#if _GLIBCXX_USE_DUAL_ABI
>-#if _GLIBCXX_USE_CXX11_ABI
>- // 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
>- };
>-
>- typedef basic_string<char> __sso_string;
>-#else // _GLIBCXX_USE_CXX11_ABI
>- typedef basic_string<char> __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<char> __sso_string;
>- typedef basic_string<char> __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:
>- /** 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;
>-
>-# 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:
>- 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;
>- };
>-
>- /** Thrown to report invalid arguments to functions. */
>- class invalid_argument : public logic_error
>- {
>- public:
>- 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;
>- };
>-
>- /** 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:
>- 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;
>- };
>-
>- /** 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:
>- 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;
>- };
>-
>- /** 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:
>- /** 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;
>-
>-# ifdef _GLIBCXX_TM_TS_INTERNAL
>- friend void*
>- ::_txnal_runtime_error_get_msg(void* e);
>-# endif
>- };
>-
>- /** Thrown to indicate range errors in internal computations. */
>- class range_error : public runtime_error
>- {
>- public:
>- explicit range_error(const string& __arg) _GLIBCXX_TXN_SAFE;
>-#if __cplusplus >= 201103L
>- explicit range_error(const char*) _GLIBCXX_TXN_SAFE;
>- range_error(const range_error&) = default;
>- range_error& operator=(const range_error&) = default;
>- range_error(range_error&&) = default;
>- range_error& operator=(range_error&&) = default;
>-#endif
>- virtual ~range_error() _GLIBCXX_NOTHROW;
>- };
>-
>- /** Thrown to indicate arithmetic overflow. */
>- class overflow_error : public runtime_error
>- {
>- public:
>- 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;
>- };
>-
>- /** Thrown to indicate arithmetic underflow. */
>- class underflow_error : public runtime_error
>- {
>- public:
>- 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;
>- };
>-
>- /// @} group exceptions
>-
>-_GLIBCXX_END_NAMESPACE_VERSION
>-} // namespace
>+#include <bits/stdexcept_except.h>
>
> #endif /* _GLIBCXX_STDEXCEPT */
>--- libstdc++-v3/include/std/optional.jj 2025-08-12 08:59:39.250115754 +0200
>+++ libstdc++-v3/include/std/optional 2025-09-05 12:42:44.814154694 +0200
>@@ -38,6 +38,7 @@
> #define __glibcxx_want_optional
> #define __glibcxx_want_optional_range_support
> #define __glibcxx_want_constrained_equality
>+#define __glibcxx_want_constexpr_exceptions
> #include <bits/version.h>
>
> #ifdef __cpp_lib_optional // C++ >= 17
>@@ -106,12 +107,21 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
> bad_optional_access() = default;
> virtual ~bad_optional_access() = default;
>
>+#if __cpp_lib_constexpr_exceptions >= 202502L
>+ constexpr
>+#endif
> const char* what() const noexcept override
> { return "bad optional access"; }
> };
>
> // XXX Does not belong here.
>- [[__noreturn__]] inline void
>+ [[__noreturn__]]
>+#if __cpp_lib_constexpr_exceptions >= 202502L
>+ constexpr
>+#else
>+ inline
>+#endif
>+ void
> __throw_bad_optional_access()
> { _GLIBCXX_THROW_OR_ABORT(bad_optional_access()); }
>
>--- libstdc++-v3/include/std/expected.jj 2025-09-04 10:37:06.621628738 +0200
>+++ libstdc++-v3/include/std/expected 2025-09-05 12:42:44.831154471 +0200
>@@ -36,6 +36,7 @@
> #define __glibcxx_want_expected
> #define __glibcxx_want_freestanding_expected
> #define __glibcxx_want_constrained_equality
>+#define __glibcxx_want_constexpr_exceptions
> #include <bits/version.h>
>
> #ifdef __cpp_lib_expected // C++ >= 23 && __cpp_concepts >= 202002L
>@@ -77,21 +78,32 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
> template<typename _Er>
> class bad_expected_access;
>
>+#if __cpp_lib_constexpr_exceptions >= 202502L
>+#define _GLIBCXX_CONSTEXPR_BAD_EXPECTED_ACCESS constexpr
>+#else
>+#define _GLIBCXX_CONSTEXPR_BAD_EXPECTED_ACCESS
>+#endif
>+
> template<>
> class bad_expected_access<void> : public exception
> {
> protected:
>- bad_expected_access() noexcept { }
>+ _GLIBCXX_CONSTEXPR_BAD_EXPECTED_ACCESS bad_expected_access() noexcept { }
>+ _GLIBCXX_CONSTEXPR_BAD_EXPECTED_ACCESS
> bad_expected_access(const bad_expected_access&) noexcept = default;
>+ _GLIBCXX_CONSTEXPR_BAD_EXPECTED_ACCESS
> bad_expected_access(bad_expected_access&&) noexcept = default;
>+ _GLIBCXX_CONSTEXPR_BAD_EXPECTED_ACCESS
> bad_expected_access& operator=(const bad_expected_access&) noexcept = default;
>+ _GLIBCXX_CONSTEXPR_BAD_EXPECTED_ACCESS
> bad_expected_access& operator=(bad_expected_access&&) noexcept = default;
>+ _GLIBCXX_CONSTEXPR_BAD_EXPECTED_ACCESS
> ~bad_expected_access() = default;
>
> public:
>
> [[nodiscard]]
>- const char*
>+ _GLIBCXX_CONSTEXPR_BAD_EXPECTED_ACCESS const char*
> what() const noexcept override
> { return "bad access to std::expected without expected value"; }
> };
>@@ -99,28 +111,28 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
> template<typename _Er>
> class bad_expected_access : public bad_expected_access<void> {
> public:
>- explicit
>+ _GLIBCXX_CONSTEXPR_BAD_EXPECTED_ACCESS explicit
> bad_expected_access(_Er __e) : _M_unex(std::move(__e)) { }
>
> // XXX const char* what() const noexcept override;
>
> [[nodiscard]]
>- _Er&
>+ _GLIBCXX_CONSTEXPR_BAD_EXPECTED_ACCESS _Er&
> error() & noexcept
> { return _M_unex; }
>
> [[nodiscard]]
>- const _Er&
>+ _GLIBCXX_CONSTEXPR_BAD_EXPECTED_ACCESS const _Er&
> error() const & noexcept
> { return _M_unex; }
>
> [[nodiscard]]
>- _Er&&
>+ _GLIBCXX_CONSTEXPR_BAD_EXPECTED_ACCESS _Er&&
> error() && noexcept
> { return std::move(_M_unex); }
>
> [[nodiscard]]
>- const _Er&&
>+ _GLIBCXX_CONSTEXPR_BAD_EXPECTED_ACCESS const _Er&&
> error() const && noexcept
> { return std::move(_M_unex); }
>
>--- libstdc++-v3/include/std/format.jj 2025-08-12 08:59:39.248115781 +0200
>+++ libstdc++-v3/include/std/format 2025-09-05 12:42:44.883153788 +0200
>@@ -38,6 +38,7 @@
> #define __glibcxx_want_format
> #define __glibcxx_want_format_ranges
> #define __glibcxx_want_format_uchar
>+#define __glibcxx_want_constexpr_exceptions
> #include <bits/version.h>
>
> #ifdef __cpp_lib_format // C++ >= 20 && HOSTED
>@@ -214,12 +215,20 @@ namespace __format
> formatter& operator=(const formatter&) = delete;
> };
>
>+#if __cpp_lib_constexpr_exceptions >= 202502L
>+#define _GLIBCXX_CONSTEXPR_FORMAT_ERROR constexpr
>+#else
>+#define _GLIBCXX_CONSTEXPR_FORMAT_ERROR
>+#endif
>+
> // [format.error], class format_error
> class format_error : public runtime_error
> {
> public:
>- explicit format_error(const string& __what) : runtime_error(__what) { }
>- explicit format_error(const char* __what) : runtime_error(__what) { }
>+ _GLIBCXX_CONSTEXPR_FORMAT_ERROR explicit format_error(const string& __what)
>+ : runtime_error(__what) { }
>+ _GLIBCXX_CONSTEXPR_FORMAT_ERROR explicit format_error(const char* __what)
>+ : runtime_error(__what) { }
> };
>
> /// @cond undocumented
>@@ -228,6 +237,8 @@ namespace __format
> __throw_format_error(const char* __what)
> { _GLIBCXX_THROW_OR_ABORT(format_error(__what)); }
>
>+#undef _GLIBCXX_CONSTEXPR_FORMAT_ERROR
>+
> namespace __format
> {
> // XXX use named functions for each constexpr error?
>--- libstdc++-v3/include/std/variant.jj 2025-08-12 08:59:39.277115396 +0200
>+++ libstdc++-v3/include/std/variant 2025-09-05 12:42:44.913153394 +0200
>@@ -36,6 +36,7 @@
> #define __glibcxx_want_freestanding_variant
> #define __glibcxx_want_variant
> #define __glibcxx_want_constrained_equality
>+#define __glibcxx_want_constexpr_exceptions
> #include <bits/version.h>
>
> #ifdef __cpp_lib_variant // C++ >= 17
>@@ -1394,24 +1395,33 @@ namespace __detail::__variant
> && (is_swappable_v<_Types> && ...))>
> swap(variant<_Types...>&, variant<_Types...>&) = delete;
>
>- [[noreturn]] void __throw_bad_variant_access(unsigned);
>+#if __cpp_lib_constexpr_exceptions >= 202502L
>+#define _GLIBCXX_CONSTEXPR_BAD_VARIANT_ACCESS constexpr
>+#else
>+#define _GLIBCXX_CONSTEXPR_BAD_VARIANT_ACCESS
>+#endif
>+ [[noreturn]] _GLIBCXX_CONSTEXPR_BAD_VARIANT_ACCESS void
>+ __throw_bad_variant_access(unsigned);
>
> class bad_variant_access : public exception
> {
> public:
>- bad_variant_access() noexcept { }
>+ _GLIBCXX_CONSTEXPR_BAD_VARIANT_ACCESS bad_variant_access() noexcept { }
>
>- const char* what() const noexcept override
>+ _GLIBCXX_CONSTEXPR_BAD_VARIANT_ACCESS const char* what()
>+ const noexcept override
> { return _M_reason; }
>
> private:
> // Must only be called with a string literal
>+ _GLIBCXX_CONSTEXPR_BAD_VARIANT_ACCESS
> bad_variant_access(const char* __reason) noexcept : _M_reason(__reason) { }
>
> // Must point to a string with static storage duration:
> const char* _M_reason = "bad variant access";
>
>- friend void __throw_bad_variant_access([[maybe_unused]] unsigned __n)
>+ friend _GLIBCXX_CONSTEXPR_BAD_VARIANT_ACCESS void
>+ __throw_bad_variant_access([[maybe_unused]] unsigned __n)
> {
> [[maybe_unused]] static constexpr const char* __reasons[] = {
> "std::get: wrong index for variant",
>@@ -1421,6 +1431,7 @@ namespace __detail::__variant
> };
> _GLIBCXX_THROW_OR_ABORT(bad_variant_access(__reasons[__n % 4u]));
> }
>+#undef _GLIBCXX_CONSTEXPR_BAD_VARIANT_ACCESS
> };
>
> template<typename... _Types>
>--- libstdc++-v3/testsuite/18_support/exception/version.cc.jj 2025-08-12 08:59:39.327114733 +0200
>+++ libstdc++-v3/testsuite/18_support/exception/version.cc 2025-09-05 12:42:44.928153198 +0200
>@@ -3,7 +3,8 @@
>
> #include <exception>
>
>-#ifdef __cpp_lib_constexpr_exceptions
>-# error "Feature test macro for constexpr_exceptions should not be provided by <exception>"
>+#ifndef __cpp_lib_constexpr_exceptions
>+# error "Feature test macro for constexpr_exceptions is missing in <exception>"
>+#elif __cpp_lib_constexpr_exceptions < 202502L
>+# error "Feature test macro for constexpr_exceptions has wrong value in <exception>"
> #endif
>-
>--- libstdc++-v3/testsuite/19_diagnostics/runtime_error/constexpr.cc.jj 2025-09-05 12:42:44.928153198 +0200
>+++ libstdc++-v3/testsuite/19_diagnostics/runtime_error/constexpr.cc 2025-09-05 12:42:44.928153198 +0200
>@@ -0,0 +1,73 @@
>+// { dg-do compile { target c++26 } }
>+
>+#include <string>
>+#include <stdexcept>
>+#include <testsuite_hooks.h>
>+
>+template <typename T>
>+constexpr bool test01()
>+{
>+ try
>+ {
>+ std::string s = "This is the first runtime error";
>+ throw T(s);
>+ }
>+ catch (const T &x)
>+ {
>+ VERIFY( std::string(x.what()) == "This is the first runtime error" );
>+ }
>+ try
>+ {
>+ throw T("This is the second runtime error");
>+ }
>+ catch (const std::runtime_error &x)
>+ {
>+ VERIFY( std::string(x.what()) == "This is the second runtime error" );
>+ }
>+ std::string s = "This is the third runtime error";
>+ T l(s);
>+ try
>+ {
>+ throw T(l);
>+ }
>+ catch (const std::runtime_error &x)
>+ {
>+ VERIFY( std::string(x.what()) == "This is the third runtime error" );
>+ }
>+ VERIFY( std::string(l.what()) == "This is the third runtime error" );
>+ s = "This is the fourth runtime error";
>+ l = T(s);
>+ try
>+ {
>+ throw T(std::move(l));
>+ }
>+ catch (const T &x)
>+ {
>+ VERIFY( std::string(x.what()) == "This is the fourth runtime error" );
>+ }
>+ T l2(s);
>+ l2 = T("This is the fifth runtime error");
>+ VERIFY( std::string(l2.what()) == "This is the fifth runtime error" );
>+ T l3("This is the sixth runtime error");
>+ VERIFY( std::string(l3.what()) == "This is the sixth runtime error" );
>+ l3 = l2;
>+ VERIFY( std::string(l2.what()) == "This is the fifth runtime error" );
>+ VERIFY( std::string(l3.what()) == "This is the fifth runtime error" );
>+ l3 = T("This is the seventh runtime error");
>+ l2 = std::move(l3);
>+ VERIFY( std::string(l2.what()) == "This is the seventh runtime error" );
>+ return true;
>+}
>+
>+static_assert(test01<std::runtime_error>());
>+static_assert(test01<std::range_error>());
>+static_assert(test01<std::overflow_error>());
>+static_assert(test01<std::underflow_error>());
>+
>+int main(void)
>+{
>+ test01<std::runtime_error>();
>+ test01<std::range_error>();
>+ test01<std::overflow_error>();
>+ test01<std::underflow_error>();
>+}
>--- libstdc++-v3/testsuite/19_diagnostics/headers/stdexcept/version.cc.jj 2025-09-05 12:42:44.928153198 +0200
>+++ libstdc++-v3/testsuite/19_diagnostics/headers/stdexcept/version.cc 2025-09-05 12:42:44.928153198 +0200
>@@ -0,0 +1,10 @@
>+// { dg-do preprocess { target c++26 } }
>+// { dg-add-options no_pch }
>+
>+#include <stdexcept>
>+
>+#ifndef __cpp_lib_constexpr_exceptions
>+# error "Feature test macro for constexpr_exceptions is missing in <stdexcept>"
>+#elif __cpp_lib_constexpr_exceptions < 202502L
>+# error "Feature test macro for constexpr_exceptions has wrong value in <stdexcept>"
>+#endif
>--- libstdc++-v3/testsuite/19_diagnostics/logic_error/constexpr.cc.jj 2025-09-05 12:42:44.928153198 +0200
>+++ libstdc++-v3/testsuite/19_diagnostics/logic_error/constexpr.cc 2025-09-05 12:42:44.928153198 +0200
>@@ -0,0 +1,75 @@
>+// { dg-do compile { target c++26 } }
>+
>+#include <string>
>+#include <stdexcept>
>+#include <testsuite_hooks.h>
>+
>+template <typename T>
>+constexpr bool test01()
>+{
>+ try
>+ {
>+ std::string s = "This is the first logic error";
>+ throw T(s);
>+ }
>+ catch (const T &x)
>+ {
>+ VERIFY( std::string(x.what()) == "This is the first logic error" );
>+ }
>+ try
>+ {
>+ throw T("This is the second logic error");
>+ }
>+ catch (const std::logic_error &x)
>+ {
>+ VERIFY( std::string(x.what()) == "This is the second logic error" );
>+ }
>+ std::string s = "This is the third logic error";
>+ T l(s);
>+ try
>+ {
>+ throw T(l);
>+ }
>+ catch (const std::logic_error &x)
>+ {
>+ VERIFY( std::string(x.what()) == "This is the third logic error" );
>+ }
>+ VERIFY( std::string(l.what()) == "This is the third logic error" );
>+ s = "This is the fourth logic error";
>+ l = T(s);
>+ try
>+ {
>+ throw T(std::move(l));
>+ }
>+ catch (const T &x)
>+ {
>+ VERIFY( std::string(x.what()) == "This is the fourth logic error" );
>+ }
>+ T l2(s);
>+ l2 = T("This is the fifth logic error");
>+ VERIFY( std::string(l2.what()) == "This is the fifth logic error" );
>+ T l3("This is the sixth logic error");
>+ VERIFY( std::string(l3.what()) == "This is the sixth logic error" );
>+ l3 = l2;
>+ VERIFY( std::string(l2.what()) == "This is the fifth logic error" );
>+ VERIFY( std::string(l3.what()) == "This is the fifth logic error" );
>+ l3 = T("This is the seventh logic error");
>+ l2 = std::move(l3);
>+ VERIFY( std::string(l2.what()) == "This is the seventh logic error" );
>+ return true;
>+}
>+
>+static_assert(test01<std::logic_error>());
>+static_assert(test01<std::domain_error>());
>+static_assert(test01<std::invalid_argument>());
>+static_assert(test01<std::length_error>());
>+static_assert(test01<std::out_of_range>());
>+
>+int main(void)
>+{
>+ test01<std::logic_error>();
>+ test01<std::domain_error>();
>+ test01<std::invalid_argument>();
>+ test01<std::length_error>();
>+ test01<std::out_of_range>();
>+}
>--- libstdc++-v3/testsuite/20_util/expected/observers.cc.jj 2025-08-12 08:59:39.340114561 +0200
>+++ libstdc++-v3/testsuite/20_util/expected/observers.cc 2025-09-05 12:42:44.951152896 +0200
>@@ -77,7 +77,10 @@ test_value()
> return true;
> }
>
>-void
>+#if __cpp_lib_constexpr_exceptions >= 202502L
>+constexpr
>+#endif
>+bool
> test_value_throw()
> {
> std::expected<int, int> e1 = std::unexpected(9);
>@@ -87,6 +90,8 @@ test_value_throw()
> VERIFY( false );
> } catch (const std::bad_expected_access<int>& e) {
> VERIFY( e.error() == 9 );
>+ long c = e.what()[0];
>+ VERIFY( c == e.what()[0] );
> }
> try {
> std::move(e1).value();
>@@ -122,6 +127,7 @@ test_value_throw()
> } catch (const std::bad_expected_access<int>& e) {
> VERIFY( e.error() == 8 );
> }
>+ return true;
> }
>
> constexpr bool
>@@ -218,6 +224,9 @@ int main()
> test_has_value();
> static_assert( test_value() );
> test_value();
>+#if __cpp_lib_constexpr_exceptions >= 202502L
>+ static_assert( test_value_throw() );
>+#endif
> test_value_throw();
> static_assert( test_error() );
> test_error();
>--- libstdc++-v3/testsuite/20_util/expected/version.cc.jj 2025-08-12 08:59:39.352114402 +0200
>+++ libstdc++-v3/testsuite/20_util/expected/version.cc 2025-09-05 12:42:44.970152646 +0200
>@@ -15,8 +15,17 @@
> # error "Feature-test macro for freestanding expected has wrong value in <version>"
> #endif
>
>+#if __cplusplus > 202302L
>+# ifndef __cpp_lib_constexpr_exceptions
>+# error "Feature test macro for constexpr_exceptions is missing in <version>"
>+# elif __cpp_lib_constexpr_exceptions < 202502L
>+# error "Feature test macro for constexpr_exceptions has wrong value in <version>"
>+# endif
>+#endif
>+
> #undef __cpp_lib_expected
> #undef __cpp_lib_freestanding_expected
>+#undef __cpp_lib_constexpr_exceptions
> #include <expected>
>
> #ifndef __cpp_lib_expected
>@@ -30,3 +39,11 @@
> #elif __cpp_lib_freestanding_expected != 202311L
> # error "Feature-test macro for freestanding expected has wrong value in <expected>"
> #endif
>+
>+#if __cplusplus > 202302L
>+# ifndef __cpp_lib_constexpr_exceptions
>+# error "Feature test macro for constexpr_exceptions is missing in <expected>"
>+# elif __cpp_lib_constexpr_exceptions < 202502L
>+# error "Feature test macro for constexpr_exceptions has wrong value in <expected>"
>+# endif
>+#endif
>--- libstdc++-v3/testsuite/20_util/variant/constexpr.cc.jj 2025-08-12 08:59:39.381114017 +0200
>+++ libstdc++-v3/testsuite/20_util/variant/constexpr.cc 2025-09-05 12:42:44.983152476 +0200
>@@ -11,6 +11,9 @@
> # error "Feature test macro for variant has wrong value for C++20 in <variant>"
> #endif
>
>+#if __cpp_lib_constexpr_exceptions >= 202502L
>+#include <string>
>+#endif
> #include <testsuite_hooks.h>
>
>
>@@ -51,6 +54,39 @@ test_assign()
>
> static_assert( test_assign() );
>
>+#if __cpp_lib_constexpr_exceptions >= 202502L
>+constexpr bool test_get()
>+{
>+ VERIFY(std::get<1>(std::variant<int, std::string>("a")) == "a");
>+ VERIFY(std::get<std::string>(std::variant<int, std::string>("a")) == "a");
>+ {
>+ try
>+ {
>+ std::get<0>(std::variant<int, std::string>("a"));
>+ }
>+ catch (const std::bad_variant_access& x)
>+ {
>+ long c = x.what()[0];
>+ VERIFY( c == x.what()[0] );
>+ }
>+ }
>+ {
>+ try
>+ {
>+ std::get<int>(std::variant<int, std::string>("a"));
>+ }
>+ catch (const std::bad_variant_access& x)
>+ {
>+ long c = x.what()[0];
>+ VERIFY( c == x.what()[0] );
>+ }
>+ }
>+ return true;
>+}
>+
>+static_assert (test_get() );
>+#endif
>+
> constexpr bool
> test_emplace()
> {
>--- libstdc++-v3/testsuite/20_util/variant/version.cc.jj 2025-08-12 08:59:39.381114017 +0200
>+++ libstdc++-v3/testsuite/20_util/variant/version.cc 2025-09-05 12:42:44.983152476 +0200
>@@ -19,8 +19,17 @@
> #endif
> #endif
>
>+#if __cplusplus > 202302L
>+#ifndef __cpp_lib_constexpr_exceptions
>+# error "Feature test macro for constexpr_exceptions is missing in <version>"
>+#elif __cpp_lib_constexpr_exceptions < 202502L
>+# error "Feature test macro for constexpr_exceptions has wrong value in <version>"
>+#endif
>+#endif
>+
> #undef __cpp_lib_variant
> #undef __cpp_lib_freestanding_variant
>+#undef __cpp_lib_constexpr_exceptions
> #include <variant>
>
> #if __cplusplus >= 202302L
>@@ -30,3 +39,11 @@
> # error "Feature test macro for freestanding std::variant has wrong value in <variant>"
> #endif
> #endif
>+
>+#if __cplusplus > 202302L
>+#ifndef __cpp_lib_constexpr_exceptions
>+# error "Feature test macro for constexpr_exceptions is missing in <variant>"
>+#elif __cpp_lib_constexpr_exceptions < 202502L
>+# error "Feature test macro for constexpr_exceptions has wrong value in <variant>"
>+#endif
>+#endif
>--- libstdc++-v3/testsuite/20_util/optional/constexpr/observers/3.cc.jj 2025-08-12 08:59:39.363114256 +0200
>+++ libstdc++-v3/testsuite/20_util/optional/constexpr/observers/3.cc 2025-09-05 12:42:44.984152463 +0200
>@@ -18,12 +18,45 @@
> // <http://www.gnu.org/licenses/>.
>
> #include <optional>
>+#include <testsuite_hooks.h>
>
> struct value_type
> {
> int i;
> };
>
>+#if __cpp_lib_constexpr_exceptions >= 202502L
>+void eat(int x)
>+{
>+}
>+
>+constexpr bool test01()
>+{
>+ enum outcome_type { nothrow, caught, bad_catch };
>+
>+ outcome_type outcome {};
>+ std::optional<value_type> o = std::nullopt;
>+
>+ try
>+ {
>+ eat(o.value().i);
>+ }
>+ catch(std::bad_optional_access const& x)
>+ {
>+ outcome = caught;
>+ long c = x.what()[0];
>+ VERIFY( c == x.what()[0] );
>+ }
>+ catch(...)
>+ { outcome = bad_catch; }
>+
>+ VERIFY( outcome == caught );
>+ return true;
>+}
>+
>+static_assert( test01() );
>+#endif
>+
> int main()
> {
> constexpr std::optional<value_type> o { value_type { 51 } };
>--- libstdc++-v3/testsuite/20_util/optional/version.cc.jj 2025-08-12 08:59:39.363114256 +0200
>+++ libstdc++-v3/testsuite/20_util/optional/version.cc 2025-09-05 12:42:44.984152463 +0200
>@@ -27,11 +27,18 @@
> # elif __cpp_lib_optional_range_support != 202406L
> # error "Feature test macro for optional range support has wrong value for C++26 in <version>"
> # endif
>+
>+# ifndef __cpp_lib_constexpr_exceptions
>+# error "Feature test macro for constexpr_exceptions is missing in <version>"
>+# elif __cpp_lib_constexpr_exceptions < 202502L
>+# error "Feature test macro for constexpr_exceptions has wrong value in <version>"
>+# endif
> #endif
>
> #undef __cpp_lib_optional
> #undef __cpp_lib_freestanding_optional
> #undef __cpp_lib_optional_range_support
>+#undef __cpp_lib_constexpr_exceptions
> #include <optional>
>
> #if __cplusplus >= 202302L
>@@ -49,4 +56,10 @@
> # if __cpp_lib_optional_range_support != 202406L
> # error "Feature test macro for optional range support has wrong value for C++26 in <optional>"
> # endif
>+
>+# ifndef __cpp_lib_constexpr_exceptions
>+# error "Feature test macro for constexpr_exceptions is missing in <optional>"
>+# elif __cpp_lib_constexpr_exceptions < 202502L
>+# error "Feature test macro for constexpr_exceptions has wrong value in <optional>"
>+# endif
> #endif
>--- libstdc++-v3/include/std/future.jj 2025-04-25 14:39:52.422862103 +0200
>+++ libstdc++-v3/include/std/future 2025-09-05 14:50:36.233382527 +0200
>@@ -34,6 +34,7 @@
> #endif
>
> #include <bits/requires_hosted.h> // concurrency
>+#include <bits/functexcept.h>
>
> #if __cplusplus < 201103L
> # include <bits/c++0x_warning.h>
>--- libstdc++-v3/include/std/shared_mutex.jj 2025-08-12 08:59:39.250115754 +0200
>+++ libstdc++-v3/include/std/shared_mutex 2025-09-05 14:53:11.537334123 +0200
>@@ -39,6 +39,7 @@
>
> #include <bits/chrono.h>
> #include <bits/error_constants.h>
>+#include <bits/new_throw.h>
> #include <bits/functexcept.h>
> #include <bits/move.h> // move, __exchange
> #include <bits/std_mutex.h> // defer_lock_t
>--- libstdc++-v3/include/std/flat_map.jj 2025-08-12 08:59:39.245115821 +0200
>+++ libstdc++-v3/include/std/flat_map 2025-09-05 14:50:54.660139484 +0200
>@@ -47,7 +47,7 @@
> #include <ranges> // views::zip
> #include <type_traits>
> #include <vector>
>-#include <bits/functexcept.h>
>+#include <bits/stdexcept_throw.h>
> #include <bits/stl_algo.h>
> #include <bits/stl_function.h> // less
> #include <bits/stl_pair.h>
>--- libstdc++-v3/include/std/syncstream.jj 2025-08-12 08:59:39.276115410 +0200
>+++ libstdc++-v3/include/std/syncstream 2025-09-05 12:42:45.055151531 +0200
>@@ -45,7 +45,6 @@
>
> #include <bits/alloc_traits.h>
> #include <bits/allocator.h>
>-#include <bits/functexcept.h>
> #include <bits/functional_hash.h>
> #include <bits/std_mutex.h>
>
>--- libstdc++-v3/include/std/flat_set.jj 2025-08-12 08:59:39.246115808 +0200
>+++ libstdc++-v3/include/std/flat_set 2025-09-05 12:42:45.102150914 +0200
>@@ -46,7 +46,6 @@
> #include <optional>
> #include <type_traits>
> #include <vector>
>-#include <bits/functexcept.h>
> #include <bits/stl_algo.h>
> #include <bits/stl_function.h> // less
> #include <bits/stl_pair.h>
>--- libstdc++-v3/include/std/bitset.jj 2025-08-29 11:14:40.301832504 +0200
>+++ libstdc++-v3/include/std/bitset 2025-09-05 14:51:58.321299819 +0200
>@@ -46,8 +46,8 @@
> #pragma GCC system_header
> #endif
>
>-#include <bits/functexcept.h> // For invalid_argument, out_of_range,
>- // overflow_error
>+#include <bits/stdexcept_throw.h> // For invalid_argument, out_of_range,
>+ // overflow_error
> #include <bits/stl_algobase.h> // For std::fill
>
> #if _GLIBCXX_HOSTED
>--- libstdc++-v3/include/std/string_view.jj 2025-08-12 08:59:39.276115410 +0200
>+++ libstdc++-v3/include/std/string_view 2025-09-05 14:49:21.080373774 +0200
>@@ -48,7 +48,10 @@
> #if __cplusplus >= 201703L
>
> #include <bits/char_traits.h>
>-#include <bits/functexcept.h>
>+#ifndef __glibcxx_exc_in_string
>+#define __glibcxx_exc_in_string 2
>+#include <bits/stdexcept_throw.h>
>+#endif
> #include <bits/functional_hash.h>
> #include <bits/range_access.h>
> #include <bits/stl_algobase.h>
>@@ -910,6 +913,14 @@ _GLIBCXX_END_NAMESPACE_VERSION
>
> #include <bits/string_view.tcc>
>
>+#if __glibcxx_exc_in_string == 2
>+#undef __glibcxx_exc_in_string
>+#if (_GLIBCXX_HOSTED && __cpp_exceptions && __cplusplus > 202302L \
>+ && __cpp_constexpr_exceptions >= 202411L)
>+#include <bits/stdexcept_throw.h>
>+#endif
>+#endif
>+
> #endif // __cplusplus <= 201402L
>
>-#endif // _GLIBCXX_EXPERIMENTAL_STRING_VIEW
>+#endif // _GLIBCXX_STRING_VIEW
>--- libstdc++-v3/include/std/array.jj 2025-08-12 08:59:39.243115847 +0200
>+++ libstdc++-v3/include/std/array 2025-09-05 14:52:19.386021981 +0200
>@@ -41,7 +41,7 @@
> #include <initializer_list>
>
> #include <type_traits>
>-#include <bits/functexcept.h>
>+#include <bits/stdexcept_throw.h>
> #include <bits/stl_algobase.h>
> #include <bits/range_access.h> // std::begin, std::end etc.
> #include <bits/utility.h> // std::index_sequence, std::tuple_size
>--- libstdc++-v3/include/std/inplace_vector.jj 2025-07-28 10:41:47.698287226 +0200
>+++ libstdc++-v3/include/std/inplace_vector 2025-09-05 14:52:10.580138126 +0200
>@@ -38,6 +38,7 @@
> #ifdef __glibcxx_inplace_vector // C++ >= 26
> #include <compare>
> #include <initializer_list>
>+#include <bits/stdexcept_throw.h>
> #include <bits/range_access.h>
> #include <bits/ranges_base.h> // borrowed_iterator_t, __detail::__container_compatible_range
> #include <bits/ranges_util.h> // subrange
>--- libstdc++-v3/include/std/string.jj 2025-04-12 13:10:32.507511040 +0200
>+++ libstdc++-v3/include/std/string 2025-09-05 14:50:18.124621374 +0200
>@@ -40,6 +40,7 @@
> #include <bits/requires_hosted.h> // containers
>
> #include <bits/c++config.h>
>+#define __glibcxx_exc_in_string 1
> #include <bits/stringfwd.h>
> #include <bits/char_traits.h>
> #include <bits/allocator.h>
>@@ -50,11 +51,20 @@
> #include <bits/stl_iterator.h>
> #include <bits/stl_function.h> // For less
> #include <ext/numeric_traits.h>
>+#include <bits/stdexcept_throw.h>
> #include <bits/stl_algobase.h>
> #include <bits/refwrap.h>
> #include <bits/range_access.h>
> #include <bits/basic_string.h>
> #include <bits/basic_string.tcc>
>+#if (_GLIBCXX_HOSTED && __cpp_exceptions && __cplusplus > 202302L \
>+ && __cpp_constexpr_exceptions >= 202411L)
>+#include <bits/stdexcept_except.h>
>+#undef __glibcxx_exc_in_string
>+#include <bits/stdexcept_throw.h>
>+#else
>+#undef __glibcxx_exc_in_string
>+#endif
>
> #define __glibcxx_want_algorithm_default_value_type
> #define __glibcxx_want_allocator_traits_is_always_equal
>--- libstdc++-v3/include/std/deque.jj 2025-04-12 13:10:32.483511372 +0200
>+++ libstdc++-v3/include/std/deque 2025-09-05 14:52:32.962842907 +0200
>@@ -61,6 +61,7 @@
>
> #include <bits/requires_hosted.h> // containers are hosted only
>
>+#include <bits/stdexcept_throw.h>
> #include <bits/stl_algobase.h>
> #include <bits/allocator.h>
> #include <bits/stl_construct.h>
>--- libstdc++-v3/include/bits/new_allocator.h.jj 2025-08-12 08:59:39.167116854 +0200
>+++ libstdc++-v3/include/bits/new_allocator.h 2025-09-05 15:06:39.928710130 +0200
>@@ -32,7 +32,7 @@
>
> #include <bits/c++config.h>
> #include <new>
>-#include <bits/functexcept.h>
>+#include <bits/new_throw.h>
> #include <bits/move.h>
> #if __cplusplus >= 201103L
> #include <type_traits>
>--- libstdc++-v3/include/bits/stl_algobase.h.jj 2025-08-12 08:59:39.185116616 +0200
>+++ libstdc++-v3/include/bits/stl_algobase.h 2025-09-05 12:42:45.309148198 +0200
>@@ -57,7 +57,6 @@
> #define _STL_ALGOBASE_H 1
>
> #include <bits/c++config.h>
>-#include <bits/functexcept.h>
> #include <bits/cpp_type_traits.h>
> #include <ext/type_traits.h>
> #include <ext/numeric_traits.h>
>--- libstdc++-v3/include/bits/stl_vector.h.jj 2025-08-27 10:20:32.745408077 +0200
>+++ libstdc++-v3/include/bits/stl_vector.h 2025-09-05 15:05:59.047246081 +0200
>@@ -57,7 +57,7 @@
> #define _STL_VECTOR_H 1
>
> #include <bits/stl_iterator_base_funcs.h>
>-#include <bits/functexcept.h>
>+#include <bits/stdexcept_throw.h>
> #include <bits/concept_check.h>
> #if __cplusplus >= 201103L
> #include <initializer_list>
>--- libstdc++-v3/include/bits/memory_resource.h.jj 2025-08-12 08:59:39.167116854 +0200
>+++ libstdc++-v3/include/bits/memory_resource.h 2025-09-05 15:06:23.127930384 +0200
>@@ -38,7 +38,7 @@
>
> #include <new> // operator new(size_t, void*)
> #include <cstddef> // size_t, max_align_t, byte
>-#include <bits/functexcept.h> // __throw_bad_array_new_length
>+#include <bits/new_throw.h> // __throw_bad_array_new_length
> #include <bits/uses_allocator.h> // allocator_arg_t, __use_alloc
> #include <bits/uses_allocator_args.h> // uninitialized_construct_using_alloc
> #include <ext/numeric_traits.h> // __int_traits
>--- libstdc++-v3/include/bits/functexcept.h.jj 2025-08-12 08:59:39.151117066 +0200
>+++ libstdc++-v3/include/bits/functexcept.h 2025-09-05 14:44:55.834872261 +0200
>@@ -39,61 +39,11 @@
> #include <bits/c++config.h>
> #include <bits/exception_defines.h>
>
>+#if _GLIBCXX_HOSTED
> namespace std _GLIBCXX_VISIBILITY(default)
> {
> _GLIBCXX_BEGIN_NAMESPACE_VERSION
>
>-#if _GLIBCXX_HOSTED
>- // Helper for exception objects in <except>
>- void
>- __throw_bad_exception(void) __attribute__((__noreturn__));
>-
>- // Helper for exception objects in <new>
>- void
>- __throw_bad_alloc(void) __attribute__((__noreturn__));
>-
>- void
>- __throw_bad_array_new_length(void) __attribute__((__noreturn__));
>-
>- // Helper for exception objects in <typeinfo>
>- void
>- __throw_bad_cast(void) __attribute__((__noreturn__,__cold__));
>-
>- void
>- __throw_bad_typeid(void) __attribute__((__noreturn__,__cold__));
>-
>- // Helpers for exception objects in <stdexcept>
>- void
>- __throw_logic_error(const char*) __attribute__((__noreturn__,__cold__));
>-
>- void
>- __throw_domain_error(const char*) __attribute__((__noreturn__,__cold__));
>-
>- void
>- __throw_invalid_argument(const char*) __attribute__((__noreturn__,__cold__));
>-
>- void
>- __throw_length_error(const char*) __attribute__((__noreturn__,__cold__));
>-
>- void
>- __throw_out_of_range(const char*) __attribute__((__noreturn__,__cold__));
>-
>- void
>- __throw_out_of_range_fmt(const char*, ...) __attribute__((__noreturn__,__cold__))
>- __attribute__((__format__(__gnu_printf__, 1, 2)));
>-
>- void
>- __throw_runtime_error(const char*) __attribute__((__noreturn__,__cold__));
>-
>- void
>- __throw_range_error(const char*) __attribute__((__noreturn__,__cold__));
>-
>- void
>- __throw_overflow_error(const char*) __attribute__((__noreturn__,__cold__));
>-
>- void
>- __throw_underflow_error(const char*) __attribute__((__noreturn__,__cold__));
>-
> // Helpers for exception objects in <ios>
> void
> __throw_ios_failure(const char*) __attribute__((__noreturn__,__cold__));
>@@ -113,31 +63,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
> void
> __throw_bad_function_call() __attribute__((__noreturn__,__cold__));
>
>-#else // ! HOSTED
>-
>- __attribute__((__noreturn__)) inline void
>- __throw_invalid_argument(const char*)
>- { std::__terminate(); }
>-
>- __attribute__((__noreturn__)) inline void
>- __throw_out_of_range(const char*)
>- { std::__terminate(); }
>-
>- __attribute__((__noreturn__)) inline void
>- __throw_out_of_range_fmt(const char*, ...)
>- { std::__terminate(); }
>-
>- __attribute__((__noreturn__)) inline void
>- __throw_runtime_error(const char*)
>- { std::__terminate(); }
>-
>- __attribute__((__noreturn__)) inline void
>- __throw_overflow_error(const char*)
>- { std::__terminate(); }
>-
>-#endif // HOSTED
>-
> _GLIBCXX_END_NAMESPACE_VERSION
> } // namespace
>+#endif // HOSTED
>
> #endif
>--- libstdc++-v3/include/bits/stl_map.h.jj 2025-08-12 08:59:39.201116404 +0200
>+++ libstdc++-v3/include/bits/stl_map.h 2025-09-05 15:03:40.383063965 +0200
>@@ -56,7 +56,7 @@
> #ifndef _STL_MAP_H
> #define _STL_MAP_H 1
>
>-#include <bits/functexcept.h>
>+#include <bits/stdexcept_throw.h>
> #include <bits/concept_check.h>
> #if __cplusplus >= 201103L
> #include <initializer_list>
>--- libstdc++-v3/include/bits/locale_classes.h.jj 2025-04-08 14:10:25.293972751 +0200
>+++ libstdc++-v3/include/bits/locale_classes.h 2025-09-05 14:57:37.618824607 +0200
>@@ -38,6 +38,8 @@
> #pragma GCC system_header
> #endif
>
>+#include <bits/typeinfo_throw.h>
>+#include <bits/functexcept.h>
> #include <bits/localefwd.h>
> #include <string>
> #include <ext/atomicity.h>
>--- libstdc++-v3/include/bits/hashtable_policy.h.jj 2025-04-08 14:10:25.291972779 +0200
>+++ libstdc++-v3/include/bits/hashtable_policy.h 2025-09-05 15:05:41.638474310 +0200
>@@ -32,6 +32,7 @@
> #define _HASHTABLE_POLICY_H 1
>
> #include <tuple> // for std::tuple, std::forward_as_tuple
>+#include <bits/stdexcept_throw.h>
> #include <bits/functional_hash.h> // for __is_fast_hash
> #include <bits/stl_algobase.h> // for std::min
> #include <bits/stl_pair.h> // for std::pair
>--- libstdc++-v3/include/bits/formatfwd.h.jj 2025-06-12 19:51:32.688010126 +0200
>+++ libstdc++-v3/include/bits/formatfwd.h 2025-09-05 12:42:45.441146465 +0200
>@@ -56,11 +56,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
> // [format.formatter], formatter
> template<typename _Tp, typename _CharT = char> struct formatter;
>
>-/// @cond undocumented
>- [[noreturn]]
>- inline void
>- __throw_format_error(const char* __what);
>-
> namespace __format
> {
> #ifdef _GLIBCXX_USE_WCHAR_T
>--- libstdc++-v3/include/bits/specfun.h.jj 2025-08-12 08:59:39.176116735 +0200
>+++ libstdc++-v3/include/bits/specfun.h 2025-09-05 15:04:39.111294039 +0200
>@@ -40,6 +40,7 @@
> # error include <cmath> and define __STDCPP_WANT_MATH_SPEC_FUNCS__
> #endif
>
>+#include <bits/stdexcept_throw.h>
> #include <bits/stl_algobase.h>
> #include <limits>
> #include <type_traits>
>--- libstdc++-v3/include/bits/basic_ios.h.jj 2025-04-08 14:10:21.314028148 +0200
>+++ libstdc++-v3/include/bits/basic_ios.h 2025-09-05 14:57:11.397170460 +0200
>@@ -34,6 +34,8 @@
> #pragma GCC system_header
> #endif
>
>+#include <bits/typeinfo_throw.h>
>+#include <bits/functexcept.h>
> #include <bits/localefwd.h>
> #include <bits/locale_classes.h>
> #include <bits/locale_facets.h>
>--- libstdc++-v3/include/tr1/cmath.jj 2025-04-08 14:10:30.502900248 +0200
>+++ libstdc++-v3/include/tr1/cmath 2025-09-05 14:48:31.178031967 +0200
>@@ -34,6 +34,7 @@
> #endif
>
> #include <bits/requires_hosted.h> // TR1
>+#include <bits/stdexcept_throw.h>
>
> #include <cmath>
>
>--- libstdc++-v3/include/tr1/memory.jj 2025-08-12 08:59:39.277115396 +0200
>+++ libstdc++-v3/include/tr1/memory 2025-09-05 12:42:45.508145586 +0200
>@@ -47,7 +47,6 @@
> #include <iosfwd> // std::basic_ostream
> #include <ext/atomicity.h>
> #include <ext/concurrence.h>
>-#include <bits/functexcept.h>
> #include <bits/stl_function.h> // std::less
> #include <debug/debug.h>
> #include <tr1/type_traits>
>--- libstdc++-v3/include/tr1/array.jj 2025-04-08 14:10:30.501900262 +0200
>+++ libstdc++-v3/include/tr1/array 2025-09-05 14:48:05.602369300 +0200
>@@ -34,6 +34,7 @@
> #endif
>
> #include <bits/requires_hosted.h> // TR1
>+#include <bits/stdexcept_throw.h>
>
> #include <bits/stl_algobase.h>
>
>--- libstdc++-v3/include/ext/vstring_util.h.jj 2025-08-12 08:59:39.243115847 +0200
>+++ libstdc++-v3/include/ext/vstring_util.h 2025-09-05 14:56:38.718601475 +0200
>@@ -39,7 +39,7 @@
> #include <ext/vstring_fwd.h>
> #include <debug/debug.h>
> #include <bits/stl_function.h> // For less
>-#include <bits/functexcept.h>
>+#include <bits/stdexcept_throw.h>
> #include <bits/localefwd.h>
> #include <bits/ostream_insert.h>
> #include <bits/stl_iterator.h>
>--- libstdc++-v3/include/ext/bitmap_allocator.h.jj 2025-08-12 08:59:39.225116086 +0200
>+++ libstdc++-v3/include/ext/bitmap_allocator.h 2025-09-05 14:53:31.813066693 +0200
>@@ -32,7 +32,7 @@
> #include <bits/requires_hosted.h> // GNU extensions are currently omitted
>
> #include <utility> // For std::pair.
>-#include <bits/functexcept.h> // For __throw_bad_alloc().
>+#include <bits/new_throw.h> // For __throw_bad_alloc().
> #include <bits/stl_function.h> // For greater_equal, and less_equal.
> #include <new> // For operator new.
> #include <debug/debug.h> // _GLIBCXX_DEBUG_ASSERT
>--- libstdc++-v3/include/ext/mt_allocator.h.jj 2025-08-12 08:59:39.226116073 +0200
>+++ libstdc++-v3/include/ext/mt_allocator.h 2025-09-05 14:56:11.376962101 +0200
>@@ -33,7 +33,7 @@
>
> #include <new>
> #include <cstdlib>
>-#include <bits/functexcept.h>
>+#include <bits/new_throw.h>
> #include <ext/atomicity.h>
> #include <bits/move.h>
> #if __cplusplus >= 201103L
>--- libstdc++-v3/include/ext/malloc_allocator.h.jj 2025-08-12 08:59:39.226116073 +0200
>+++ libstdc++-v3/include/ext/malloc_allocator.h 2025-09-05 14:53:45.923880577 +0200
>@@ -34,7 +34,7 @@
> #include <cstdlib>
> #include <cstddef>
> #include <new>
>-#include <bits/functexcept.h>
>+#include <bits/new_throw.h>
> #include <bits/move.h>
> #if __cplusplus >= 201103L
> #include <type_traits>
>--- libstdc++-v3/include/ext/debug_allocator.h.jj 2025-08-12 08:59:39.226116073 +0200
>+++ libstdc++-v3/include/ext/debug_allocator.h 2025-09-05 14:54:04.053641452 +0200
>@@ -45,7 +45,7 @@
> #include <bits/requires_hosted.h> // GNU extensions are currently omitted
>
> #include <stdexcept>
>-#include <bits/functexcept.h>
>+#include <bits/stdexcept_throw.h>
> #include <ext/alloc_traits.h>
>
> namespace __gnu_cxx _GLIBCXX_VISIBILITY(default)
>--- libstdc++-v3/include/ext/concurrence.h.jj 2025-08-12 08:59:39.225116086 +0200
>+++ libstdc++-v3/include/ext/concurrence.h 2025-09-05 12:42:45.660143591 +0200
>@@ -35,7 +35,7 @@
>
> #include <exception>
> #include <bits/gthr.h>
>-#include <bits/functexcept.h>
>+#include <bits/exception_defines.h>
> #include <bits/cpp_type_traits.h>
> #include <ext/type_traits.h>
>
>--- libstdc++-v3/include/ext/throw_allocator.h.jj 2025-08-12 08:59:39.242115860 +0200
>+++ libstdc++-v3/include/ext/throw_allocator.h 2025-09-05 14:54:50.351030806 +0200
>@@ -55,7 +55,8 @@
> #include <ostream>
> #include <stdexcept>
> #include <utility>
>-#include <bits/functexcept.h>
>+#include <bits/new_throw.h>
>+#include <bits/stdexcept_throw.h>
> #include <bits/move.h>
> #if __cplusplus >= 201103L
> # include <functional>
>--- libstdc++-v3/include/ext/string_conversions.h.jj 2025-08-12 08:59:39.242115860 +0200
>+++ libstdc++-v3/include/ext/string_conversions.h 2025-09-05 14:55:28.985521229 +0200
>@@ -41,7 +41,7 @@
>
> #include <bits/c++config.h>
> #include <ext/numeric_traits.h>
>-#include <bits/functexcept.h>
>+#include <bits/stdexcept_throw.h>
> #include <cstdlib>
> #include <cwchar>
> #include <cstdio>
>--- libstdc++-v3/include/ext/pool_allocator.h.jj 2025-08-12 08:59:39.238115913 +0200
>+++ libstdc++-v3/include/ext/pool_allocator.h 2025-09-05 14:56:01.831088007 +0200
>@@ -47,7 +47,7 @@
> #include <bits/c++config.h>
> #include <cstdlib>
> #include <new>
>-#include <bits/functexcept.h>
>+#include <bits/new_throw.h>
> #include <ext/atomicity.h>
> #include <ext/concurrence.h>
> #include <bits/move.h>
>--- libstdc++-v3/include/ext/ropeimpl.h.jj 2025-08-12 08:59:39.241115874 +0200
>+++ libstdc++-v3/include/ext/ropeimpl.h 2025-09-05 14:55:06.986811390 +0200
>@@ -42,7 +42,7 @@
>
> #include <cstdio>
> #include <ostream>
>-#include <bits/functexcept.h>
>+#include <bits/stdexcept_throw.h>
>
> #include <ext/algorithm> // For copy_n and lexicographical_compare_3way
> #include <ext/memory> // For uninitialized_copy_n
>--- libstdc++-v3/include/tr2/dynamic_bitset.jj 2025-08-12 08:59:39.283115317 +0200
>+++ libstdc++-v3/include/tr2/dynamic_bitset 2025-09-05 15:07:21.407166344 +0200
>@@ -37,7 +37,7 @@
> #include <vector>
> #include <string>
> #include <istream>
>-#include <bits/functexcept.h>
>+#include <bits/stdexcept_throw.h>
> #include <bits/stl_algo.h> // For fill
> #include <bits/cxxabi_forced.h>
>
>--- libstdc++-v3/include/experimental/optional.jj 2025-08-12 08:59:39.221116139 +0200
>+++ libstdc++-v3/include/experimental/optional 2025-09-05 12:42:45.753142371 +0200
>@@ -38,7 +38,7 @@
> #include <stdexcept>
> #include <new>
> #include <initializer_list>
>-#include <bits/functexcept.h>
>+#include <bits/exception_defines.h>
> #include <bits/functional_hash.h>
> #include <bits/enable_special_members.h>
> #include <bits/move.h>
>--- libstdc++-v3/include/Makefile.am.jj 2025-09-04 18:51:34.142709630 +0200
>+++ libstdc++-v3/include/Makefile.am 2025-09-05 15:30:18.118144000 +0200
>@@ -132,10 +132,14 @@ bits_freestanding = \
> ${bits_srcdir}/cpp_type_traits.h \
> ${bits_srcdir}/elements_of.h \
> ${bits_srcdir}/enable_special_members.h \
>+ ${bits_srcdir}/exception_except.h \
>+ ${bits_srcdir}/exception_throw.h \
> ${bits_srcdir}/functexcept.h \
> ${bits_srcdir}/functional_hash.h \
> ${bits_srcdir}/invoke.h \
> ${bits_srcdir}/iterator_concepts.h \
>+ ${bits_srcdir}/new_except.h \
>+ ${bits_srcdir}/new_throw.h \
> ${bits_srcdir}/max_size_type.h \
> ${bits_srcdir}/memoryfwd.h \
> ${bits_srcdir}/monostate.h \
>@@ -154,6 +158,10 @@ bits_freestanding = \
> ${bits_srcdir}/ranges_util.h \
> ${bits_srcdir}/refwrap.h \
> ${bits_srcdir}/sat_arith.h \
>+ ${bits_srcdir}/stdexcept_except.h \
>+ ${bits_srcdir}/stdexcept_throw.h \
>+ ${bits_srcdir}/stdexcept_throwdef.h \
>+ ${bits_srcdir}/stdexcept_throwfwd.h \
> ${bits_srcdir}/stl_algo.h \
> ${bits_srcdir}/stl_algobase.h \
> ${bits_srcdir}/stl_construct.h \
>@@ -168,6 +176,8 @@ bits_freestanding = \
> ${bits_srcdir}/stl_relops.h \
> ${bits_srcdir}/stl_uninitialized.h \
> ${bits_srcdir}/text_encoding-data.h \
>+ ${bits_srcdir}/typeinfo_except.h \
>+ ${bits_srcdir}/typeinfo_throw.h \
> ${bits_srcdir}/version.h \
> ${bits_srcdir}/string_view.tcc \
> ${bits_srcdir}/unicode.h \
>--- libstdc++-v3/include/Makefile.in.jj 2025-09-04 18:51:34.142709630 +0200
>+++ libstdc++-v3/include/Makefile.in 2025-09-05 15:34:45.245648016 +0200
>@@ -487,10 +487,14 @@ bits_freestanding = \
> ${bits_srcdir}/cpp_type_traits.h \
> ${bits_srcdir}/elements_of.h \
> ${bits_srcdir}/enable_special_members.h \
>+ ${bits_srcdir}/exception_except.h \
>+ ${bits_srcdir}/exception_throw.h \
> ${bits_srcdir}/functexcept.h \
> ${bits_srcdir}/functional_hash.h \
> ${bits_srcdir}/invoke.h \
> ${bits_srcdir}/iterator_concepts.h \
>+ ${bits_srcdir}/new_except.h \
>+ ${bits_srcdir}/new_throw.h \
> ${bits_srcdir}/max_size_type.h \
> ${bits_srcdir}/memoryfwd.h \
> ${bits_srcdir}/monostate.h \
>@@ -509,6 +513,10 @@ bits_freestanding = \
> ${bits_srcdir}/ranges_util.h \
> ${bits_srcdir}/refwrap.h \
> ${bits_srcdir}/sat_arith.h \
>+ ${bits_srcdir}/stdexcept_except.h \
>+ ${bits_srcdir}/stdexcept_throw.h \
>+ ${bits_srcdir}/stdexcept_throwdef.h \
>+ ${bits_srcdir}/stdexcept_throwfwd.h \
> ${bits_srcdir}/stl_algo.h \
> ${bits_srcdir}/stl_algobase.h \
> ${bits_srcdir}/stl_construct.h \
>@@ -523,6 +531,8 @@ bits_freestanding = \
> ${bits_srcdir}/stl_relops.h \
> ${bits_srcdir}/stl_uninitialized.h \
> ${bits_srcdir}/text_encoding-data.h \
>+ ${bits_srcdir}/typeinfo_except.h \
>+ ${bits_srcdir}/typeinfo_throw.h \
> ${bits_srcdir}/version.h \
> ${bits_srcdir}/string_view.tcc \
> ${bits_srcdir}/unicode.h \
>--- libstdc++-v3/src/c++17/floating_from_chars.cc.jj 2025-08-12 08:59:39.312114932 +0200
>+++ libstdc++-v3/src/c++17/floating_from_chars.cc 2025-09-05 15:13:12.282566366 +0200
>@@ -45,7 +45,6 @@
> #include <cstdlib>
> #include <cstring>
> #include <locale.h>
>-#include <bits/functexcept.h>
> #if _GLIBCXX_HAVE_XLOCALE_H
> # include <xlocale.h>
> #endif
>--- libstdc++-v3/src/c++11/regex.cc.jj 2025-08-12 08:59:39.300115091 +0200
>+++ libstdc++-v3/src/c++11/regex.cc 2025-09-05 15:15:20.172889724 +0200
>@@ -24,7 +24,6 @@
>
> #include <stdexcept>
> #include <bits/regex_error.h>
>-#include <bits/functexcept.h>
>
> namespace std _GLIBCXX_VISIBILITY(default)
> {
>--- libstdc++-v3/src/c++11/functexcept.cc.jj 2025-08-12 08:59:39.298115118 +0200
>+++ libstdc++-v3/src/c++11/functexcept.cc 2025-09-05 15:16:01.730344906 +0200
>@@ -20,7 +20,6 @@
> // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
> // <http://www.gnu.org/licenses/>.
>
>-#include <bits/functexcept.h>
> #include <cstdlib>
> #include <exception>
> #include <stdexcept>
>--- libstdc++-v3/src/c++11/snprintf_lite.cc.jj 2025-08-12 08:59:39.300115091 +0200
>+++ libstdc++-v3/src/c++11/snprintf_lite.cc 2025-09-05 15:14:53.708236677 +0200
>@@ -25,7 +25,7 @@
>
> #include <stdarg.h>
> #include <stddef.h>
>-#include <bits/functexcept.h>
>+#include <bits/stdexcept_throw.h>
>
> namespace __gnu_cxx {
>
>--- libstdc++-v3/src/c++11/thread.cc.jj 2025-04-08 14:10:30.553899538 +0200
>+++ libstdc++-v3/src/c++11/thread.cc 2025-09-05 15:13:27.316369272 +0200
>@@ -30,6 +30,7 @@
> #include <system_error>
> #include <cerrno>
> #include <cxxabi_forced.h>
>+#include <bits/functexcept.h>
>
> #ifndef _GLIBCXX_USE_NANOSLEEP
> # ifdef _GLIBCXX_HAVE_SLEEP
>--- libstdc++-v3/testsuite/util/testsuite_shared.cc.jj 2025-08-12 08:59:39.413113593 +0200
>+++ libstdc++-v3/testsuite/util/testsuite_shared.cc 2025-09-05 15:16:28.952988017 +0200
>@@ -22,7 +22,7 @@
> #include <set>
> #include <map>
> #include <ext/mt_allocator.h>
>-#include <bits/functexcept.h>
>+#include <bits/exception_throw.h>
> #if __cpp_rtti
> # include <typeinfo>
> #endif
>--- libstdc++-v3/testsuite/util/testsuite_hooks.h.jj 2025-08-12 08:59:39.410113632 +0200
>+++ libstdc++-v3/testsuite/util/testsuite_hooks.h 2025-09-05 15:17:02.342551165 +0200
>@@ -44,7 +44,7 @@
> #define _GLIBCXX_TESTSUITE_HOOKS_H
>
> #include <bits/c++config.h>
>-#include <bits/functexcept.h>
>+#include <bits/stdexcept_throw.h>
> #include <ctime>
> #include <stdio.h>
>
>--- libstdc++-v3/testsuite/util/io/verified_cmd_line_input.cc.jj 2025-08-12 08:59:39.410113632 +0200
>+++ libstdc++-v3/testsuite/util/io/verified_cmd_line_input.cc 2025-09-05 12:42:46.019138880 +0200
>@@ -38,7 +38,7 @@
> #include <limits.h>
> #include <utility>
> #include <stdlib.h>
>-#include <bits/functexcept.h>
>+#include <bits/exception_defines.h>
>
> namespace __gnu_pbds
> {
>--- libstdc++-v3/testsuite/20_util/allocator/105975.cc.jj 2023-09-19 17:45:02.757817019 +0200
>+++ libstdc++-v3/testsuite/20_util/allocator/105975.cc 2025-09-05 12:42:46.038138630 +0200
>@@ -9,10 +9,11 @@ consteval bool test_pr105957()
> {
> std::allocator<long long> a;
> auto n = std::size_t(-1) / (sizeof(long long) - 1);
>- auto p = a.allocate(n); // { dg-error "constexpr" }
>+ auto p = a.allocate(n); // { dg-error "constexpr" "" { target c++23_down } }
> a.deallocate(p, n);
> return true;
> }
> static_assert( test_pr105957() ); // { dg-error "non-constant" }
>+// { dg-error "uncaught exception of type 'std::bad_array_new_length'" "" { target c++26 } 16 }
>
>-// { dg-error "throw_bad_array_new_length" "" { target *-*-* } 0 }
>+// { dg-error "throw_bad_array_new_length" "" { target c++23_down } 0 }
>--- libstdc++-v3/testsuite/23_containers/inplace_vector/access/capacity.cc.jj 2025-07-20 08:12:07.487355771 +0200
>+++ libstdc++-v3/testsuite/23_containers/inplace_vector/access/capacity.cc 2025-09-05 12:42:46.073138171 +0200
>@@ -20,12 +20,11 @@ test_reserve()
> v.reserve(N);
>
> #ifdef __cpp_exceptions
>-#ifdef __cpp_lib_constexpr_exceptions
>-#error remove the consteval check
>-#endif
>+#ifndef __cpp_lib_constexpr_exceptions
> if consteval {
> return;
> }
>+#endif
>
> try
> {
>--- libstdc++-v3/testsuite/23_containers/inplace_vector/access/elem.cc.jj 2025-07-27 23:31:11.362985774 +0200
>+++ libstdc++-v3/testsuite/23_containers/inplace_vector/access/elem.cc 2025-09-05 12:42:46.083138040 +0200
>@@ -14,12 +14,11 @@ test_out_of_capacity()
> std::inplace_vector<T, N> v;
>
> #ifdef __cpp_exceptions
>-#ifdef __cpp_lib_constexpr_exceptions
>-#error remove the consteval check
>-#endif
>+#ifndef __cpp_lib_constexpr_exceptions
> if consteval {
> return;
> }
>+#endif
>
> try
> {
>@@ -82,12 +81,11 @@ test_access()
> VERIFY( e4a == T(5) );
>
> #ifdef __cpp_exceptions
>-#ifdef __cpp_lib_constexpr_exceptions
>-#error remove the consteval check
>-#endif
>+#ifndef __cpp_lib_constexpr_exceptions
> if consteval {
> return;
> }
>+#endif
>
> try
> {
>--- libstdc++-v3/testsuite/23_containers/inplace_vector/cons/1.cc.jj 2025-07-20 08:12:07.487355771 +0200
>+++ libstdc++-v3/testsuite/23_containers/inplace_vector/cons/1.cc 2025-09-05 12:42:46.089137961 +0200
>@@ -164,10 +164,9 @@ test_n()
> VERIFY( z0.begin() == z0.end() );
>
> #ifdef __cpp_exceptions
>-#ifdef __cpp_lib_constexpr_exceptions
>-#error remove the consteval check
>-#endif
>+#ifndef __cpp_lib_constexpr_exceptions
> if not consteval {
>+#endif
> try
> {
> std::inplace_vector<int, 2> ct(3);
>@@ -186,8 +185,10 @@ test_n()
> {
> }
>
>+#ifndef __cpp_lib_constexpr_exceptions
> }
> #endif
>+#endif
>
> #ifdef __cpp_lib_constexpr_inplace_vector
> #error remove the consteval check
>@@ -241,10 +242,9 @@ test_n_val()
> VERIFY( z0.begin() == z0.end() );
>
> #ifdef __cpp_exceptions
>-#ifdef __cpp_lib_constexpr_exceptions
>-#error remove the consteval check
>-#endif
>+#ifndef __cpp_lib_constexpr_exceptions
> if not consteval {
>+#endif
> try
> {
> std::inplace_vector<int, 2> ct(3, 11);
>@@ -262,8 +262,10 @@ test_n_val()
> catch (std::bad_alloc const&)
> {
> }
>+#ifndef __cpp_lib_constexpr_exceptions
> }
> #endif
>+#endif
>
> #ifdef __cpp_lib_constexpr_inplace_vector
> #error remove the consteval check
>@@ -317,10 +319,9 @@ test_initializer_list()
> VERIFY( z0.begin() == z0.end() );
>
> #ifdef __cpp_exceptions
>-#ifdef __cpp_lib_constexpr_exceptions
>-#error remove the consteval check
>-#endif
>+#ifndef __cpp_lib_constexpr_exceptions
> if not consteval {
>+#endif
> try
> {
> std::inplace_vector<int, 2> ct{11, 22, 33};
>@@ -338,8 +339,10 @@ test_initializer_list()
> catch (std::bad_alloc const&)
> {
> }
>+#ifndef __cpp_lib_constexpr_exceptions
> }
> #endif
>+#endif
>
> #ifdef __cpp_lib_constexpr_inplace_vector
> #error remove the consteval check
>--- libstdc++-v3/testsuite/23_containers/inplace_vector/cons/from_range.cc.jj 2025-07-27 23:31:11.363985761 +0200
>+++ libstdc++-v3/testsuite/23_containers/inplace_vector/cons/from_range.cc 2025-09-05 12:42:46.095137882 +0200
>@@ -41,12 +41,11 @@ do_test_it()
> VERIFY( eq<T>(v4, {a, 4}) );
>
> #ifdef __cpp_exceptions
>-#ifdef __cpp_lib_constexpr_exceptions
>-#error remove the consteval check
>-#endif
>+#ifndef __cpp_lib_constexpr_exceptions
> if consteval {
> return;
> }
>+#endif
>
> bounds = typename It::ContainerType(a, a+9);
> try
>@@ -104,12 +103,11 @@ do_test_r()
> VERIFY( eq<T>(v4, {a, 4}) );
>
> #ifdef __cpp_exceptions
>-#ifdef __cpp_lib_constexpr_exceptions
>-#error remove the consteval check
>-#endif
>+#ifndef __cpp_lib_constexpr_exceptions
> if consteval {
> return;
> }
>+#endif
>
> try
> {
>--- libstdc++-v3/testsuite/23_containers/inplace_vector/modifiers/single_insert.cc.jj 2025-07-20 08:12:07.489355745 +0200
>+++ libstdc++-v3/testsuite/23_containers/inplace_vector/modifiers/single_insert.cc 2025-09-05 12:42:46.110137685 +0200
>@@ -48,12 +48,11 @@ test_add_to_full()
> VERIFY( eq<T>(v, {a, N}) );
>
> #ifdef __cpp_exceptions
>-#ifdef __cpp_lib_constexpr_exceptions
>-#error remove the consteval check
>-#endif
>+#ifndef __cpp_lib_constexpr_exceptions
> if consteval {
> return;
> }
>+#endif
>
> try
> {
>--- libstdc++-v3/testsuite/23_containers/inplace_vector/modifiers/assign.cc.jj 2025-07-27 23:31:11.380985541 +0200
>+++ libstdc++-v3/testsuite/23_containers/inplace_vector/modifiers/assign.cc 2025-09-05 12:42:46.135137357 +0200
>@@ -60,12 +60,11 @@ test_assign_empty_it()
> VERIFY( v.empty() );
>
> #ifdef __cpp_exceptions
>-#ifdef __cpp_lib_constexpr_exceptions
>-#error remove the consteval check
>-#endif
>+#ifndef __cpp_lib_constexpr_exceptions
> if consteval {
> return;
> }
>+#endif
>
> static_assert(N < 9);
>
>@@ -136,12 +135,11 @@ test_assign_empty_other()
> VERIFY( v.empty() );
>
> #ifdef __cpp_exceptions
>-#ifdef __cpp_lib_constexpr_exceptions
>-#error remove the consteval check
>-#endif
>+#ifndef __cpp_lib_constexpr_exceptions
> if consteval {
> return;
> }
>+#endif
>
> static_assert(N < 9);
>
>--- libstdc++-v3/testsuite/23_containers/inplace_vector/modifiers/multi_insert.cc.jj 2025-07-27 23:31:11.392985386 +0200
>+++ libstdc++-v3/testsuite/23_containers/inplace_vector/modifiers/multi_insert.cc 2025-09-05 12:42:46.154137108 +0200
>@@ -105,12 +105,11 @@ test_add_to_full_it()
> VERIFY( rit4.base() == a+2 );
>
> #ifdef __cpp_exceptions
>-#ifdef __cpp_lib_constexpr_exceptions
>-#error remove the consteval check
>-#endif
>+#ifndef __cpp_lib_constexpr_exceptions
> if consteval {
> return;
> }
>+#endif
>
> try
> {
>@@ -191,12 +190,11 @@ test_add_to_full_other()
> VERIFY( it == v.begin() );
>
> #ifdef __cpp_exceptions
>-#ifdef __cpp_lib_constexpr_exceptions
>-#error remove the consteval check
>-#endif
>+#ifndef __cpp_lib_constexpr_exceptions
> if consteval {
> return;
> }
>+#endif
>
> v = std::inplace_vector<T, N>(std::from_range, std::span(a, a+N));
> try
>@@ -249,12 +247,11 @@ test_append_range()
> VERIFY( eq<T>(v, {a, 15}) );
>
> #ifdef __cpp_exceptions
>-#ifdef __cpp_lib_constexpr_exceptions
>-#error remove the consteval check
>-#endif
>+#ifndef __cpp_lib_constexpr_exceptions
> if consteval {
> return;
> }
>+#endif
>
> try
> {
>@@ -313,12 +310,11 @@ test_insert_range()
> VERIFY( it == v.begin() + 5 );
>
> #ifdef __cpp_exceptions
>-#ifdef __cpp_lib_constexpr_exceptions
>-#error remove the consteval check
>-#endif
>+#ifndef __cpp_lib_constexpr_exceptions
> if consteval {
> return;
> }
>+#endif
>
> const bool seg = std::ranges::sized_range<Range> || std::ranges::forward_range<Range>;
> auto vc = v;
>@@ -390,12 +386,11 @@ test_insert_iterators()
> VERIFY( it == v.begin() + 5 );
>
> #ifdef __cpp_exceptions
>-#ifdef __cpp_lib_constexpr_exceptions
>-#error remove the consteval check
>-#endif
>+#ifndef __cpp_lib_constexpr_exceptions
> if consteval {
> return;
> }
>+#endif
>
> const bool seg = std::forward_iterator<It>;
> auto vc = v;
>@@ -457,12 +452,11 @@ test_insert_initializer_list()
> VERIFY( it == v.begin() + 5 );
>
> #ifdef __cpp_exceptions
>-#ifdef __cpp_lib_constexpr_exceptions
>-#error remove the consteval check
>-#endif
>+#ifndef __cpp_lib_constexpr_exceptions
> if consteval {
> return;
> }
>+#endif
>
> std::initializer_list<T> il
> = {T(0), T(1), T(2), T(3), T(4), T(5), T(6), T(7), T(8), T(9)};
>@@ -520,12 +514,11 @@ test_insert_repeated()
> VERIFY( it == v.begin() + 5 );
>
> #ifdef __cpp_exceptions
>-#ifdef __cpp_lib_constexpr_exceptions
>-#error remove the consteval check
>-#endif
>+#ifndef __cpp_lib_constexpr_exceptions
> if consteval {
> return;
> }
>+#endif
>
> try
> {
>--- libstdc++-v3/libsupc++/exception.jj 2025-07-16 13:10:11.065411190 +0200
>+++ libstdc++-v3/libsupc++/exception 2025-09-05 13:00:26.103224519 +0200
>@@ -41,6 +41,7 @@
> #define __glibcxx_want_constexpr_exceptions
> #define __glibcxx_want_exception_ptr_cast
> #include <bits/version.h>
>+#include <bits/exception_except.h>
>
> extern "C++" {
>
>@@ -50,34 +51,6 @@ namespace std _GLIBCXX_VISIBILITY(defaul
> * @{
> */
>
>- /** If an %exception is thrown which is not listed in a function's
>- * %exception specification, one of these may be thrown.
>- *
>- * @ingroup exceptions
>- */
>- class bad_exception : public exception
>- {
>- public:
>- _GLIBCXX26_CONSTEXPR bad_exception() _GLIBCXX_USE_NOEXCEPT { }
>-
>-#if __cplusplus >= 202400L
>- constexpr virtual ~bad_exception() _GLIBCXX_TXN_SAFE_DYN noexcept {}
>-
>- constexpr virtual const char* what() const _GLIBCXX_TXN_SAFE_DYN noexcept
>- {
>- return "std::bad_exception";
>- }
>-#else
>- // This declaration is not useless:
>- // http://gcc.gnu.org/onlinedocs/gcc-3.0.2/gcc_6.html#SEC118
>- virtual ~bad_exception() _GLIBCXX_TXN_SAFE_DYN _GLIBCXX_USE_NOEXCEPT;
>-
>- // See comment in eh_exception.cc.
>- virtual const char*
>- what() const _GLIBCXX_TXN_SAFE_DYN _GLIBCXX_USE_NOEXCEPT;
>-#endif
>- };
>-
> /// If you write a replacement %terminate handler, it must be of this type.
> typedef void (*terminate_handler) ();
>
>--- libstdc++-v3/libsupc++/new.jj 2025-07-10 23:25:52.118279942 +0200
>+++ libstdc++-v3/libsupc++/new 2025-09-05 13:40:45.818441908 +0200
>@@ -47,6 +47,7 @@
> #define __glibcxx_want_destroying_delete
> #define __glibcxx_want_constexpr_new
> #include <bits/version.h>
>+#include <bits/new_except.h> // std::bad_alloc, std::bad_array_new_length
>
> #pragma GCC diagnostic push
> #pragma GCC diagnostic ignored "-Wc++11-extensions" // scoped enum
>@@ -57,63 +58,6 @@ extern "C++" {
>
> namespace std
> {
>- /**
>- * @brief Exception possibly thrown by @c new.
>- * @ingroup exceptions
>- *
>- * @c bad_alloc (or classes derived from it) is used to report allocation
>- * errors from the throwing forms of @c new. */
>- class bad_alloc : public exception
>- {
>- public:
>- _GLIBCXX26_CONSTEXPR bad_alloc() throw() { }
>-
>-#if __cplusplus >= 201103L
>- _GLIBCXX26_CONSTEXPR bad_alloc(const bad_alloc&) = default;
>- _GLIBCXX26_CONSTEXPR bad_alloc& operator=(const bad_alloc&) = default;
>-#endif
>-
>-#if __cplusplus >= 202400L
>- constexpr virtual ~bad_alloc() noexcept {}
>-
>- constexpr virtual const char* what() const noexcept
>- {
>- return "std::bad_alloc";
>- }
>-#else
>- // This declaration is not useless:
>- // http://gcc.gnu.org/onlinedocs/gcc-3.0.2/gcc_6.html#SEC118
>- virtual ~bad_alloc() throw();
>-
>- // See comment in eh_exception.cc.
>- virtual const char* what() const throw();
>-#endif
>- };
>-
>-#if __cplusplus >= 201103L
>- class bad_array_new_length : public bad_alloc
>- {
>- public:
>- _GLIBCXX26_CONSTEXPR bad_array_new_length() throw() { }
>-
>-#if __cplusplus >= 202400L
>- constexpr virtual ~bad_array_new_length() noexcept {}
>-
>- constexpr virtual const char* what() const noexcept
>- {
>- return "std::bad_array_new_length";
>- }
>-#else
>- // This declaration is not useless:
>- // http://gcc.gnu.org/onlinedocs/gcc-3.0.2/gcc_6.html#SEC118
>- virtual ~bad_array_new_length() throw();
>-
>- // See comment in eh_exception.cc.
>- virtual const char* what() const throw();
>-#endif
>- };
>-#endif
>-
> #if __cpp_aligned_new
> enum class align_val_t: size_t {};
> #endif
>--- libstdc++-v3/libsupc++/typeinfo.jj 2025-07-10 23:25:52.119279929 +0200
>+++ libstdc++-v3/libsupc++/typeinfo 2025-09-05 13:46:02.522284569 +0200
>@@ -40,6 +40,7 @@
>
> #define __glibcxx_want_constexpr_typeinfo
> #include <bits/version.h>
>+#include <bits/typeinfo_except.h> // std::bad_cast, std::bad_typeid
>
> #pragma GCC visibility push(default)
>
>@@ -213,61 +214,6 @@ namespace std
> #endif
> }
> #endif
>-
>-
>- /**
>- * @brief Thrown during incorrect typecasting.
>- * @ingroup exceptions
>- *
>- * If you attempt an invalid @c dynamic_cast expression, an instance of
>- * this class (or something derived from this class) is thrown. */
>- class bad_cast : public exception
>- {
>- public:
>- _GLIBCXX26_CONSTEXPR bad_cast() _GLIBCXX_USE_NOEXCEPT { }
>-
>-#if __cplusplus >= 202400L
>- constexpr virtual ~bad_cast() noexcept {}
>-
>- constexpr virtual const char* what() const noexcept
>- {
>- return "std::bad_cast";
>- }
>-#else
>- // This declaration is not useless:
>- // http://gcc.gnu.org/onlinedocs/gcc-3.0.2/gcc_6.html#SEC118
>- virtual ~bad_cast() _GLIBCXX_USE_NOEXCEPT;
>-
>- // See comment in eh_exception.cc.
>- virtual const char* what() const _GLIBCXX_USE_NOEXCEPT;
>-#endif
>- };
>-
>- /**
>- * @brief Thrown when a NULL pointer in a @c typeid expression is used.
>- * @ingroup exceptions
>- */
>- class bad_typeid : public exception
>- {
>- public:
>- _GLIBCXX26_CONSTEXPR bad_typeid () _GLIBCXX_USE_NOEXCEPT { }
>-
>-#if __cplusplus >= 202400L
>- constexpr virtual ~bad_typeid() noexcept {}
>-
>- constexpr virtual const char* what() const noexcept
>- {
>- return "std::bad_typeid";
>- }
>-#else
>- // This declaration is not useless:
>- // http://gcc.gnu.org/onlinedocs/gcc-3.0.2/gcc_6.html#SEC118
>- virtual ~bad_typeid() _GLIBCXX_USE_NOEXCEPT;
>-
>- // See comment in eh_exception.cc.
>- virtual const char* what() const _GLIBCXX_USE_NOEXCEPT;
>-#endif
>- };
> } // namespace std
>
> } // extern "C++"
>--- libgomp/omp.h.in.jj 2025-06-02 21:58:22.142775820 +0200
>+++ libgomp/omp.h.in 2025-09-06 03:19:29.002729171 +0200
>@@ -439,7 +439,7 @@ extern const char *omp_get_uid_from_devi
> #if __cplusplus >= 201103L
>
> /* std::__throw_bad_alloc and std::__throw_bad_array_new_length. */
>-#include <bits/functexcept.h>
>+#include <bits/new_throw.h>
>
> namespace omp
> {
>--- gcc/testsuite/g++.dg/tree-ssa/pr110819.C.jj 2025-04-08 14:09:01.684136626 +0200
>+++ gcc/testsuite/g++.dg/tree-ssa/pr110819.C 2025-09-05 12:42:46.247135888 +0200
>@@ -11,4 +11,5 @@ void use_idx_const_size_reserve() {
> for (std::vector<int>::size_type i = 0; i < s; i++)
> f(v[i]);
> }
>-// { dg-final { scan-tree-dump-not "delete" "optimized" } }
>+// For C++26 delete appears in ~bad_array() and ~bad_array_new_length() dtors.
>+// { dg-final { scan-tree-dump-not "delete" "optimized" { target c++23_down } } }
>--- gcc/testsuite/g++.dg/tree-ssa/pr96945.C.jj 2025-04-08 14:09:01.711136251 +0200
>+++ gcc/testsuite/g++.dg/tree-ssa/pr96945.C 2025-09-05 12:42:46.258135743 +0200
>@@ -57,4 +57,5 @@ struct c7 {
> void foo7(){
> std::vector<c7> vi = {c7(),c7(),c7()};
> }
>-// { dg-final { scan-tree-dump-not "delete" "optimized" } }
>+// For C++26 delete appears in ~bad_array() and ~bad_array_new_length() dtors.
>+// { dg-final { scan-tree-dump-not "delete" "optimized" { target c++23_down } } }
>--- gcc/testsuite/g++.dg/tree-ssa/pr109442.C.jj 2025-04-08 14:09:01.684136626 +0200
>+++ gcc/testsuite/g++.dg/tree-ssa/pr109442.C 2025-09-05 12:42:46.269135599 +0200
>@@ -9,4 +9,5 @@ T vat1(std::vector<T> v1) {
> // This should compile to empty function; check that no size of
> // vector is determined and there is no allocation
> // { dg-final { scan-tree-dump-not "_M_start" "optimized" } }
>-// { dg-final { scan-tree-dump-not "delete" "optimized" } }
>+// For C++26 delete appears in ~bad_array() and ~bad_array_new_length() dtors.
>+// { dg-final { scan-tree-dump-not "delete" "optimized" { target c++23_down } } }
>--- gcc/testsuite/g++.dg/tree-ssa/pr116868.C.jj 2025-04-08 14:09:01.684136626 +0200
>+++ gcc/testsuite/g++.dg/tree-ssa/pr116868.C 2025-09-05 12:42:46.281135441 +0200
>@@ -9,4 +9,5 @@ int sumVector() {
> }
> return sum;
> }
>-// { dg-final { scan-tree-dump-not "delete" "optimized" } }
>+// For C++26 delete appears in ~bad_array() and ~bad_array_new_length() dtors.
>+// { dg-final { scan-tree-dump-not "delete" "optimized" { target c++23_down } } }
>--- gcc/testsuite/g++.dg/tree-ssa/pr58483.C.jj 2025-04-08 14:09:01.693136501 +0200
>+++ gcc/testsuite/g++.dg/tree-ssa/pr58483.C 2025-09-05 12:42:46.284135402 +0200
>@@ -11,4 +11,5 @@ void use_idx_const_size_reserve() {
> for (std::vector<int>::size_type i = 0; i < s; i++)
> f(v[i]);
> }
>-// { dg-final { scan-tree-dump-not "delete" "optimized" } }
>+// For C++26 delete appears in ~bad_array() and ~bad_array_new_length() dtors.
>+// { dg-final { scan-tree-dump-not "delete" "optimized" { target c++23_down } } }
>
>
> Jakub
>
>
More information about the Libstdc++
mailing list