gcc/libstdc++-v3/testsuite/20_util
Jakub Jelinek 62c126db6b libstdc++: Implement C++26 P3378R2 - constexpr exception types
The following patch attempts to implement the C++26 P3378R2 - constexpr
exception types paper.

This is quite complicated, because most of these classes which should
be constexpr-ized use solely or mostly out of line definitions in
libstdc++, both for historical, code size and dual ABI reasons, so that
one can throw these as exceptions between TUs with old vs. new (or vice
versa) ABIs.
For this reason, logic_error/runtime_error and classes derived from it
have the old ABI std::string object inside of them and the exported
APIs from libstdc++.so.6 ensure the right thing.

Now, because new invoked during constant evaluation needs to be deleted
during the same constant evaluation and can't leak into the constant
expressions, I think we don't have to use COW strings under the hood
(which aren't constexpr I guess because of reference counting/COW) and
we can use something else, the patch uses heap allocated std::string
object (where __cow_constexpr_string class has just a pointer to that).
As I think we still want to hide the ugly details if !consteval in the
library, the patch exports 8 __cow_string class symbols (6 existing which
were previously just not exported and 2 new ones) and if !consteval
calls those through extern "C" _Zmangled_name symbols.  The functions
are always_inline.

And then logic_error etc. have for C++26 (precisely for
__cpp_lib_constexpr_exceptions >= 202502L) constexpr definitions of
cdtors/methods.  This results in slightly larger code (a few insns at most)
at runtime for C++26, e.g. instead of calling say some logic error
cdtor/method with 2 arguments it calls some __cow_string one with 2
arguments but + 8 bytes pointer additions on both.

The patch also removes the __throw_format_error forward declaration
which apparently wasn't needed for anything as all __throw_format_error
users were either in <format> or included <format> before the uses,
reverts the
https://gcc.gnu.org/pipermail/libstdc++/2025-July/062598.html
patch and makes sure __throw_* functions (only those for exception types
which the P3378R2 or P3068R5 papers made constexpr usable and there are
actually constexpr/consteval uses of those) are constexpr for C++26
constexpr exceptions.

The patch does that by splitting the bits/functexcept.h header:
1) bits/functexcept.h stays for the __throw_* functions which are (at
least for now) never constexpr (the <ios>, <system_error>, <future>
and <functional> std::exception derived classes) or are never used
or never used in constexpr/consteval contexts (<exception>, <typeinfo>
std::exception derived classes and std::range_error).
2) bits/new_{throw,except}.h for __throw_bad_alloc/__throw_bad_array_new_length
and std::bad_alloc/std::bad_array_new_length (where <new> includes
<bits/new_except.h> and <bits/new_throw.h> as well for the C++26 constexpr
exceptions case)
3) for the most complicated <stdexcept> stuff, one header
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 one header without header guards which will
depending on __glibcxx_exc_in_string include one or the other because
<string> vs. <string_view> vs. <stdexcept> have heavy interdependencies

2025-12-11  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/new_except.h: New file.
	* include/bits/new_throw.h: New file.
	* include/bits/stdexcept_throw.h: New file.
	* include/bits/stdexcept_throwdef.h: New file.
	* include/bits/stdexcept_throwfwd.h: New file.
	* include/std/stdexcept: Include bits/stdexcept_except.h and move
	everything after <string> include except for std::range_error into
	include/bits/stdexcept_except.h.
	(std::range_error): If __cpp_lib_constexpr_exceptions >= 202502L
	make all cdtors and methods constexpr.
	* include/bits/stdexcept_except.h: New file.
	* 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_alloc, __throw_bad_array_new_length,  __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_overflow_error, __throw_underflow_error): Move declarations to
	other headers - <bits/new_throw.h> and <bits/stdexcept_throwfwd.h>.
	* include/bits/stl_map.h: Include <bits/stdexcept_throw.h> instead
	of <bits/functexcept.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/functexcept.h>.
	* include/bits/locale_classes.h: Likewise.
	* 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}/{new,stdexcept}_{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_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++/new: Include <bits/new_except.h>.
	(std::bad_alloc, std::bad_array_new_length): Move defintion to
	<bits/new_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.
2025-12-11 19:54:44 +01:00
..
add_const
add_cv
add_lvalue_reference
add_pointer
add_rvalue_reference
add_volatile
addressof
align
aligned_storage
aligned_union
alignment_of
allocator libstdc++: Implement C++26 P3378R2 - constexpr exception types 2025-12-11 19:54:44 +01:00
allocator_traits libstdc++: Fix -Wmaybe-uninitialized warnings in testsuite 2025-09-27 21:18:43 +01:00
any c++: Unwrap type traits defined in terms of builtins within diagnostics [PR117294] 2025-07-25 08:18:45 +10:00
as_const
assume_aligned
auto_ptr
bad_function_call
bind libstdc++: Use deducing this in std::bind when available [PR80564] 2025-12-05 21:09:34 -05:00
bitset libstdc++: std::bitset<0>("zero") should throw std::invalid_argument [PR121054] 2025-11-14 13:08:52 +00:00
bool_constant
common_reference libstdc++: Implement P2655R3 changes to common_reference bullet 1 2025-12-05 13:43:29 -05:00
common_type/requirements
conditional/requirements
constant_wrapper libstdc++: Implement constant_wrapper, cw from P2781R9. 2025-09-08 09:38:53 +02:00
copyable_function libstdc++: Reduce chances of object aliasing for function wrapper. 2025-08-27 06:35:04 +02:00
decay/requirements
declval/requirements
default_delete
duration libstdc++: Fix -Wmaybe-uninitialized warnings in testsuite 2025-09-27 21:18:43 +01:00
duration_cast
enable_if/requirements
enable_shared_from_this
exchange
expected libstdc++: Implement C++26 P3378R2 - constexpr exception types 2025-12-11 19:54:44 +01:00
extent
forward
forward_like
from_chars
function
function_objects libstdc++/testsuite: Fix malformed dg-error directive 2025-12-05 12:48:44 -05:00
function_ref libstdc++: Fix construction function_ref from nontype<&S::x> and reference_wrapper [PR121858] 2025-11-18 11:51:16 +01:00
has_unique_object_representations
has_virtual_destructor
hash libstdc++: Fix hash<__int128> test for x32 [PR121150] 2025-07-18 10:29:58 +01:00
headers libstdc++: use -Wno-deprecated-declarations 2025-11-12 09:05:41 +05:30
in_place
integer_comparisons libstdc++: Extend __is_standard_integer to cover extended integer types 2025-12-08 18:55:02 +00:00
integer_sequence
integral_constant
invoke_result
is_abstract
is_aggregate
is_arithmetic
is_array
is_assignable
is_base_of
is_bounded_array
is_class
is_complete_or_unbounded libstdc++: Unnecessary type completion in __is_complete_or_unbounded [PR120717] 2025-06-24 09:33:25 -04:00
is_compound
is_const
is_constant_evaluated
is_constructible
is_convertible
is_copy_assignable
is_copy_constructible
is_default_constructible
is_destructible
is_empty
is_enum
is_final
is_floating_point
is_function
is_fundamental
is_implicit_lifetime libstd++: Implement C++23 P2674R1 - A trait for implicit lifetime types 2025-10-30 08:46:26 +01:00
is_implicitly_default_constructible
is_integral
is_invocable
is_layout_compatible
is_literal_type libstdc++: use -Wno-deprecated-declarations 2025-11-12 09:05:41 +05:30
is_lvalue_reference
is_member_function_pointer
is_member_object_pointer
is_member_pointer
is_move_assignable
is_move_constructible
is_nothrow_assignable
is_nothrow_constructible
is_nothrow_convertible
is_nothrow_copy_assignable
is_nothrow_copy_constructible
is_nothrow_default_constructible
is_nothrow_destructible
is_nothrow_invocable
is_nothrow_move_assignable
is_nothrow_move_constructible
is_nothrow_swappable
is_nothrow_swappable_with
is_null_pointer
is_object
is_pod libstdc++: use -Wno-deprecated-declarations 2025-11-12 09:05:41 +05:30
is_pointer
is_pointer_interconvertible
is_polymorphic
is_reference
is_rvalue_reference
is_same
is_scalar
is_scoped_enum
is_signed
is_standard_layout
is_sufficiently_aligned libstdc++: Implement is_sufficiently_aligned [PR120994] 2025-08-21 11:54:41 +02:00
is_swappable
is_swappable_with
is_trivial
is_trivially_assignable
is_trivially_constructible
is_trivially_copy_assignable
is_trivially_copy_constructible
is_trivially_copyable
is_trivially_default_constructible
is_trivially_destructible
is_trivially_move_assignable
is_trivially_move_constructible
is_unbounded_array
is_union
is_unsigned
is_virtual_base_of
is_void
is_volatile
logical_traits
make_signed/requirements
make_unsigned libstdc++: Ensure std::make_unsigned<Enum> works for 128-bit enum 2025-07-15 10:25:39 +01:00
memory_resource
monostate
monotonic_buffer_resource
move
move_if_noexcept
move_only_function libstdc++: Reduce chances of object aliasing for function wrapper. 2025-08-27 06:35:04 +02:00
nonesuch
optional libstdc++: Implement C++26 P3378R2 - constexpr exception types 2025-12-11 19:54:44 +01:00
owner_equal libstdc++: Add smart ptr owner_equals and owner_hash [PR117403] 2025-07-09 12:14:40 +01:00
owner_hash libstdc++: Add smart ptr owner_equals and owner_hash [PR117403] 2025-07-09 12:14:40 +01:00
owner_less
pair libstdc++: Fix std::get<T> for std::pair with reference members [PR121745] 2025-09-03 12:16:18 +01:00
pointer_safety
pointer_traits
polymorphic_allocator
rank
ratio libstdc++: Explicitly pass -Wsystem-headers in tests that need it 2025-09-16 20:59:10 -04:00
raw_storage_iterator
reference_from_temporary
reference_wrapper libstdc++: Implement rest of P2655R3 common_reference of reference_wrapper 2025-12-05 13:43:40 -05:00
remove_all_extents
remove_const
remove_cv
remove_cvref
remove_extent
remove_pointer
remove_reference
remove_volatile
result_of
scoped_allocator libstdc++: Suppress some more additional diagnostics [PR117294] 2025-08-21 10:03:19 +01:00
shared_ptr libstdc++: use -Wno-deprecated-declarations 2025-11-12 09:05:41 +05:30
smartptr.adapt
specialized_algorithms libstdc++: Ensure that ranges::destroy destroys in constexpr [PR121024] 2025-07-15 10:25:48 +01:00
stdbit
steady_clock
synchronized_pool_resource libstdc++: Fix memory_resource.cc bootstrap failure for non-gthreads targets 2025-07-09 10:37:42 +01:00
system_clock
time_point
time_point_cast
to_address
to_chars
to_underlying
tuple libstdc++: Add constructors and assignments for tuple<> with tuple-like types [PR119721] 2025-10-29 17:09:15 +01:00
type_identity/requirements
typeindex
underlying_type/requirements
unique_ptr libstdc++: use -Wno-deprecated-declarations 2025-11-12 09:05:41 +05:30
unreachable
unsynchronized_pool_resource libstdc++: Fix double free in new pool resource test [PR118681] 2025-07-09 00:56:48 +01:00
unwrap_reference
uses_allocator
variant libstdc++: Implement C++26 P3378R2 - constexpr exception types 2025-12-11 19:54:44 +01:00
void_t
weak_ptr libstdc++: Add missing -pthread for new tests [PR122401] 2025-10-27 18:24:20 +00:00
rel_ops.cc
temporary_buffer.cc
variable_templates_for_traits.cc libstdc++: use -Wno-deprecated-declarations 2025-11-12 09:05:41 +05:30