On Fri, May 22, 2026 at 1:40 AM Jonathan Wakely <[email protected]> wrote:
> The P3471R4 and P3697R1 proposals adding hardened preconditions also > defined feature test macros that can be tested to check if the hardened > preconditions are checked. For our implementation, those checks are > enabled by defining _GLIBCXX_ASSERTIONS. > > To implement this, I've aded all the __cpp_lib_hardened_xxx macros at > the end of bits/version.def, because the simplest way to define many of > them seems to be to make the depend on the macro for the main feature > and additionally depend on defined(_GLIBCXX_ASSERTIONS). > > libstdc++-v3/ChangeLog: > > * include/bits/version.def: Define macros for hardened > preconditions. > * include/bits/version.h: Regenerate. > * include/std/array: Define "want" macro for hardened > precondition macro. > * include/std/bitset: Likewise. > * include/std/deque: Likewise. > * include/std/expected: Likewise. > * include/std/forward_list: Likewise. > * include/std/inplace_vector: Likewise. > * include/std/iterator: Likewise. > * include/std/list: Likewise. > * include/std/mdspan: Likewise. > * include/std/memory: Likewise. > * include/std/optional: Likewise. > * include/std/ranges: Likewise. > * include/std/span: Likewise. > * include/std/stacktrace: Likewise. > * include/std/string: Likewise. > * include/std/string_view: Likewise. > * include/std/valarray: Likewise. > * include/std/vector: Likewise. > * testsuite/23_containers/array/tuple_interface/get_neg.cc: > Adjust dg-error line numbers. > --- > > Tested x86_64-linux. > Review: *p3471r4* * basic_string: OK * basic_string_view: OK * bitset: OK * deque: OK * expected: OK * forward_list: OK * inplace_vector: OK * list: OK * mdspan: constructor precondition is not checked (maybe should be in extent), I would like to revisit operator[] * optional: OK * span: assert missing for all constructors (for fixed size) * valarray: OK * vector: OK, outside of what Nathan pointed Drop span and mdspan from this commit, we should handle them separately, Keep only the already implemented ones., *p3697*: * basic_stacktrace: OK * common_iterator: OK * counted_iterator: OK * shared_ptr_array: FTM not included in memory * view_interface: FTM is missing, as you noticed, front/back are in, should we do it separately with LWG4577 Fix FTM, otherwise, it looks good. issues: * https://cplusplus.github.io/LWG/issue4214 - not accepted * https://cplusplus.github.io/LWG/issue4276 - no change needed * https://cplusplus.github.io/LWG/issue4408 - LEWG * https://cplusplus.github.io/LWG/issue4577 - maybe do it, and then define view_interface > libstdc++-v3/include/bits/version.def | 156 ++++++++++++++ > libstdc++-v3/include/bits/version.h | 190 ++++++++++++++++++ > libstdc++-v3/include/std/array | 1 + > libstdc++-v3/include/std/bitset | 1 + > libstdc++-v3/include/std/deque | 1 + > libstdc++-v3/include/std/expected | 1 + > libstdc++-v3/include/std/forward_list | 1 + > libstdc++-v3/include/std/inplace_vector | 1 + > libstdc++-v3/include/std/iterator | 2 + > libstdc++-v3/include/std/list | 1 + > libstdc++-v3/include/std/mdspan | 1 + > libstdc++-v3/include/std/memory | 1 + > libstdc++-v3/include/std/optional | 1 + > libstdc++-v3/include/std/ranges | 1 + > libstdc++-v3/include/std/span | 1 + > libstdc++-v3/include/std/stacktrace | 1 + > libstdc++-v3/include/std/string | 1 + > libstdc++-v3/include/std/string_view | 1 + > libstdc++-v3/include/std/valarray | 3 + > libstdc++-v3/include/std/vector | 1 + > .../array/tuple_interface/get_neg.cc | 6 +- > 21 files changed, 370 insertions(+), 3 deletions(-) > > diff --git a/libstdc++-v3/include/bits/version.def > b/libstdc++-v3/include/bits/version.def > index 1f0d3a2670e5..e56c11b4179f 100644 > --- a/libstdc++-v3/include/bits/version.def > +++ b/libstdc++-v3/include/bits/version.def > @@ -2030,6 +2030,16 @@ ftms = { > }; > }; > > +ftms = { > + name = hardened_basic_stacktrace; > + values = { > + v = 202502; > + cxxmin = 23; > + hosted = yes; > + extra_cond = "defined(__glibcxx_stacktrace) && > defined(_GLIBCXX_ASSERTIONS)"; > + }; > +}; > + > ftms = { > name = start_lifetime_as; > values = { > @@ -2410,6 +2420,152 @@ ftms = { > }; > }; > > +ftms = { > + name = hardened_array; > + values = { > + v = 202502; > + cxxmin = 11; > + extra_cond = "defined(_GLIBCXX_ASSERTIONS)"; > + }; > +}; > + > +ftms = { > + name = hardened_basic_string; > + values = { > + v = 202502; > + extra_cond = "defined(_GLIBCXX_ASSERTIONS)"; > + }; > +}; > + > +ftms = { > + name = hardened_basic_string_view; > + values = { > + v = 202502; > + extra_cond = "defined(__glibcxx_string_view) && > defined(_GLIBCXX_ASSERTIONS)"; > + }; > +}; > + > +ftms = { > + name = hardened_bitset; > + values = { > + v = 202502; > + extra_cond = "defined(_GLIBCXX_ASSERTIONS)"; > + }; > +}; > + > +ftms = { > + name = hardened_common_iterator; > + values = { > + v = 202502; > + extra_cond = "defined(__glibcxx_ranges) && > defined(_GLIBCXX_ASSERTIONS)"; > + }; > +}; > + > +ftms = { > + name = hardened_counted_iterator; > + values = { > + v = 202502; > + extra_cond = "defined(__glibcxx_ranges) && > defined(_GLIBCXX_ASSERTIONS)"; > + }; > +}; > + > +ftms = { > + name = hardened_deque; > + values = { > + v = 202502; > + extra_cond = "defined(_GLIBCXX_ASSERTIONS)"; > + }; > +}; > + > +ftms = { > + name = hardened_expected; > + values = { > + v = 202502; > + extra_cond = "defined(__glibcxx_expected) && > defined(_GLIBCXX_ASSERTIONS)"; > + }; > +}; > + > +ftms = { > + name = hardened_forward_list; > + values = { > + v = 202502; > + cxxmin = 11; > + extra_cond = "defined(_GLIBCXX_ASSERTIONS)"; > + }; > +}; > + > +ftms = { > + name = hardened_inplace_vector; > + values = { > + v = 202502; > + extra_cond = "defined(__glibcxx_inplace_vector) && > defined(_GLIBCXX_ASSERTIONS)"; > + }; > +}; > + > +ftms = { > + name = hardened_list; > + values = { > + v = 202502; > + extra_cond = "defined(_GLIBCXX_ASSERTIONS)"; > + }; > +}; > + > +ftms = { > + name = hardened_mdspan; > + values = { > + v = 202502; > + extra_cond = "defined(__glibcxx_mdspan) && > defined(_GLIBCXX_ASSERTIONS)"; > + }; > +}; > + > +ftms = { > + name = hardened_optional; > + values = { > + v = 202502; > + extra_cond = "defined(__glibcxx_optional) && > defined(_GLIBCXX_ASSERTIONS)"; > + }; > +}; > + > +ftms = { > + name = hardened_shared_ptr_array; > + values = { > + v = 202502; > + extra_cond = "defined(__glibcxx_shared_ptr_arrays) && > defined(_GLIBCXX_ASSERTIONS)"; > + }; > +}; > + > +ftms = { > + name = hardened_span; > + values = { > + v = 202502; > + extra_cond = "defined(__glibcxx_span) && > defined(_GLIBCXX_ASSERTIONS)"; > + }; > +}; > + > +ftms = { > + name = hardened_valarray; > + values = { > + v = 202502; > + extra_cond = "defined(_GLIBCXX_ASSERTIONS)"; > + }; > +}; > + > +ftms = { > + name = hardened_vector; > + values = { > + v = 202502; > + extra_cond = "defined(_GLIBCXX_ASSERTIONS)"; > + }; > +}; > + > +ftms = { > + name = hardened_view_interface; > + values = { > + v = 202502; > + extra_cond = "defined(__glibcxx_ranges) && > defined(_GLIBCXX_ASSERTIONS)"; > + }; > +}; > + > // Standard test specifications. > stds[97] = ">= 199711L"; > stds[03] = ">= 199711L"; > diff --git a/libstdc++-v3/include/bits/version.h > b/libstdc++-v3/include/bits/version.h > index 66ac0ebef680..1d0beca30a8f 100644 > --- a/libstdc++-v3/include/bits/version.h > +++ b/libstdc++-v3/include/bits/version.h > @@ -2256,6 +2256,16 @@ > #endif /* !defined(__cpp_lib_stacktrace) */ > #undef __glibcxx_want_stacktrace > > +#if !defined(__cpp_lib_hardened_basic_stacktrace) > +# if (__cplusplus >= 202100L) && _GLIBCXX_HOSTED && > (defined(__glibcxx_stacktrace) && defined(_GLIBCXX_ASSERTIONS)) > +# define __glibcxx_hardened_basic_stacktrace 202502L > +# if defined(__glibcxx_want_all) || > defined(__glibcxx_want_hardened_basic_stacktrace) > +# define __cpp_lib_hardened_basic_stacktrace 202502L > +# endif > +# endif > +#endif /* !defined(__cpp_lib_hardened_basic_stacktrace) */ > +#undef __glibcxx_want_hardened_basic_stacktrace > + > #if !defined(__cpp_lib_start_lifetime_as) > # if (__cplusplus >= 202100L) > # define __glibcxx_start_lifetime_as 202207L > @@ -2675,4 +2685,184 @@ > #endif /* !defined(__cpp_lib_is_structural) */ > #undef __glibcxx_want_is_structural > > +#if !defined(__cpp_lib_hardened_array) > +# if (__cplusplus >= 201103L) && (defined(_GLIBCXX_ASSERTIONS)) > +# define __glibcxx_hardened_array 202502L > +# if defined(__glibcxx_want_all) || > defined(__glibcxx_want_hardened_array) > +# define __cpp_lib_hardened_array 202502L > +# endif > +# endif > +#endif /* !defined(__cpp_lib_hardened_array) */ > +#undef __glibcxx_want_hardened_array > + > +#if !defined(__cpp_lib_hardened_basic_string) > +# if (defined(_GLIBCXX_ASSERTIONS)) > +# define __glibcxx_hardened_basic_string 202502L > +# if defined(__glibcxx_want_all) || > defined(__glibcxx_want_hardened_basic_string) > +# define __cpp_lib_hardened_basic_string 202502L > +# endif > +# endif > +#endif /* !defined(__cpp_lib_hardened_basic_string) */ > +#undef __glibcxx_want_hardened_basic_string > + > +#if !defined(__cpp_lib_hardened_basic_string_view) > +# if (defined(__glibcxx_string_view) && defined(_GLIBCXX_ASSERTIONS)) > +# define __glibcxx_hardened_basic_string_view 202502L > +# if defined(__glibcxx_want_all) || > defined(__glibcxx_want_hardened_basic_string_view) > +# define __cpp_lib_hardened_basic_string_view 202502L > +# endif > +# endif > +#endif /* !defined(__cpp_lib_hardened_basic_string_view) */ > +#undef __glibcxx_want_hardened_basic_string_view > + > +#if !defined(__cpp_lib_hardened_bitset) > +# if (defined(_GLIBCXX_ASSERTIONS)) > +# define __glibcxx_hardened_bitset 202502L > +# if defined(__glibcxx_want_all) || > defined(__glibcxx_want_hardened_bitset) > +# define __cpp_lib_hardened_bitset 202502L > +# endif > +# endif > +#endif /* !defined(__cpp_lib_hardened_bitset) */ > +#undef __glibcxx_want_hardened_bitset > + > +#if !defined(__cpp_lib_hardened_common_iterator) > +# if (defined(__glibcxx_ranges) && defined(_GLIBCXX_ASSERTIONS)) > +# define __glibcxx_hardened_common_iterator 202502L > +# if defined(__glibcxx_want_all) || > defined(__glibcxx_want_hardened_common_iterator) > +# define __cpp_lib_hardened_common_iterator 202502L > +# endif > +# endif > +#endif /* !defined(__cpp_lib_hardened_common_iterator) */ > +#undef __glibcxx_want_hardened_common_iterator > + > +#if !defined(__cpp_lib_hardened_counted_iterator) > +# if (defined(__glibcxx_ranges) && defined(_GLIBCXX_ASSERTIONS)) > +# define __glibcxx_hardened_counted_iterator 202502L > +# if defined(__glibcxx_want_all) || > defined(__glibcxx_want_hardened_counted_iterator) > +# define __cpp_lib_hardened_counted_iterator 202502L > +# endif > +# endif > +#endif /* !defined(__cpp_lib_hardened_counted_iterator) */ > +#undef __glibcxx_want_hardened_counted_iterator > + > +#if !defined(__cpp_lib_hardened_deque) > +# if (defined(_GLIBCXX_ASSERTIONS)) > +# define __glibcxx_hardened_deque 202502L > +# if defined(__glibcxx_want_all) || > defined(__glibcxx_want_hardened_deque) > +# define __cpp_lib_hardened_deque 202502L > +# endif > +# endif > +#endif /* !defined(__cpp_lib_hardened_deque) */ > +#undef __glibcxx_want_hardened_deque > + > +#if !defined(__cpp_lib_hardened_expected) > +# if (defined(__glibcxx_expected) && defined(_GLIBCXX_ASSERTIONS)) > +# define __glibcxx_hardened_expected 202502L > +# if defined(__glibcxx_want_all) || > defined(__glibcxx_want_hardened_expected) > +# define __cpp_lib_hardened_expected 202502L > +# endif > +# endif > +#endif /* !defined(__cpp_lib_hardened_expected) */ > +#undef __glibcxx_want_hardened_expected > + > +#if !defined(__cpp_lib_hardened_forward_list) > +# if (__cplusplus >= 201103L) && (defined(_GLIBCXX_ASSERTIONS)) > +# define __glibcxx_hardened_forward_list 202502L > +# if defined(__glibcxx_want_all) || > defined(__glibcxx_want_hardened_forward_list) > +# define __cpp_lib_hardened_forward_list 202502L > +# endif > +# endif > +#endif /* !defined(__cpp_lib_hardened_forward_list) */ > +#undef __glibcxx_want_hardened_forward_list > + > +#if !defined(__cpp_lib_hardened_inplace_vector) > +# if (defined(__glibcxx_inplace_vector) && defined(_GLIBCXX_ASSERTIONS)) > +# define __glibcxx_hardened_inplace_vector 202502L > +# if defined(__glibcxx_want_all) || > defined(__glibcxx_want_hardened_inplace_vector) > +# define __cpp_lib_hardened_inplace_vector 202502L > +# endif > +# endif > +#endif /* !defined(__cpp_lib_hardened_inplace_vector) */ > +#undef __glibcxx_want_hardened_inplace_vector > + > +#if !defined(__cpp_lib_hardened_list) > +# if (defined(_GLIBCXX_ASSERTIONS)) > +# define __glibcxx_hardened_list 202502L > +# if defined(__glibcxx_want_all) || defined(__glibcxx_want_hardened_list) > +# define __cpp_lib_hardened_list 202502L > +# endif > +# endif > +#endif /* !defined(__cpp_lib_hardened_list) */ > +#undef __glibcxx_want_hardened_list > + > +#if !defined(__cpp_lib_hardened_mdspan) > +# if (defined(__glibcxx_mdspan) && defined(_GLIBCXX_ASSERTIONS)) > +# define __glibcxx_hardened_mdspan 202502L > +# if defined(__glibcxx_want_all) || > defined(__glibcxx_want_hardened_mdspan) > +# define __cpp_lib_hardened_mdspan 202502L > +# endif > +# endif > +#endif /* !defined(__cpp_lib_hardened_mdspan) */ > +#undef __glibcxx_want_hardened_mdspan > + > +#if !defined(__cpp_lib_hardened_optional) > +# if (defined(__glibcxx_optional) && defined(_GLIBCXX_ASSERTIONS)) > +# define __glibcxx_hardened_optional 202502L > +# if defined(__glibcxx_want_all) || > defined(__glibcxx_want_hardened_optional) > +# define __cpp_lib_hardened_optional 202502L > +# endif > +# endif > +#endif /* !defined(__cpp_lib_hardened_optional) */ > +#undef __glibcxx_want_hardened_optional > + > +#if !defined(__cpp_lib_hardened_shared_ptr_array) > +# if (defined(__glibcxx_shared_ptr_arrays) && > defined(_GLIBCXX_ASSERTIONS)) > +# define __glibcxx_hardened_shared_ptr_array 202502L > +# if defined(__glibcxx_want_all) || > defined(__glibcxx_want_hardened_shared_ptr_array) > +# define __cpp_lib_hardened_shared_ptr_array 202502L > +# endif > +# endif > +#endif /* !defined(__cpp_lib_hardened_shared_ptr_array) */ > +#undef __glibcxx_want_hardened_shared_ptr_array > + > +#if !defined(__cpp_lib_hardened_span) > +# if (defined(__glibcxx_span) && defined(_GLIBCXX_ASSERTIONS)) > +# define __glibcxx_hardened_span 202502L > +# if defined(__glibcxx_want_all) || defined(__glibcxx_want_hardened_span) > +# define __cpp_lib_hardened_span 202502L > +# endif > +# endif > +#endif /* !defined(__cpp_lib_hardened_span) */ > +#undef __glibcxx_want_hardened_span > + > +#if !defined(__cpp_lib_hardened_valarray) > +# if (defined(_GLIBCXX_ASSERTIONS)) > +# define __glibcxx_hardened_valarray 202502L > +# if defined(__glibcxx_want_all) || > defined(__glibcxx_want_hardened_valarray) > +# define __cpp_lib_hardened_valarray 202502L > +# endif > +# endif > +#endif /* !defined(__cpp_lib_hardened_valarray) */ > +#undef __glibcxx_want_hardened_valarray > + > +#if !defined(__cpp_lib_hardened_vector) > +# if (defined(_GLIBCXX_ASSERTIONS)) > +# define __glibcxx_hardened_vector 202502L > +# if defined(__glibcxx_want_all) || > defined(__glibcxx_want_hardened_vector) > +# define __cpp_lib_hardened_vector 202502L > +# endif > +# endif > +#endif /* !defined(__cpp_lib_hardened_vector) */ > +#undef __glibcxx_want_hardened_vector > + > +#if !defined(__cpp_lib_hardened_view_interface) > +# if (defined(__glibcxx_ranges) && defined(_GLIBCXX_ASSERTIONS)) > +# define __glibcxx_hardened_view_interface 202502L > +# if defined(__glibcxx_want_all) || > defined(__glibcxx_want_hardened_view_interface) > +# define __cpp_lib_hardened_view_interface 202502L > +# endif > +# endif > +#endif /* !defined(__cpp_lib_hardened_view_interface) */ > +#undef __glibcxx_want_hardened_view_interface > + > #undef __glibcxx_want_all > diff --git a/libstdc++-v3/include/std/array > b/libstdc++-v3/include/std/array > index 22f6251d4fe3..5d3edbea6495 100644 > --- a/libstdc++-v3/include/std/array > +++ b/libstdc++-v3/include/std/array > @@ -49,6 +49,7 @@ > > #define __glibcxx_want_array_constexpr > #define __glibcxx_want_freestanding_array > +#define __glibcxx_want_hardened_array > #define __glibcxx_want_nonmember_container_access > #define __glibcxx_want_to_array > #include <bits/version.h> > diff --git a/libstdc++-v3/include/std/bitset > b/libstdc++-v3/include/std/bitset > index 64dae5be8bf9..a8cb337f4b15 100644 > --- a/libstdc++-v3/include/std/bitset > +++ b/libstdc++-v3/include/std/bitset > @@ -62,6 +62,7 @@ > > #define __glibcxx_want_constexpr_bitset > #define __glibcxx_want_bitset // ...construct from string_view > +#define __glibcxx_want_hardened_bitset > #include <bits/version.h> > > #ifdef __cpp_lib_bitset // ...construct from string_view > diff --git a/libstdc++-v3/include/std/deque > b/libstdc++-v3/include/std/deque > index 3899b68e7367..3b2f34fc7075 100644 > --- a/libstdc++-v3/include/std/deque > +++ b/libstdc++-v3/include/std/deque > @@ -75,6 +75,7 @@ > #define __glibcxx_want_allocator_traits_is_always_equal > #define __glibcxx_want_containers_ranges > #define __glibcxx_want_erase_if > +#define __glibcxx_want_hardened_deque > #define __glibcxx_want_nonmember_container_access > #include <bits/version.h> > > diff --git a/libstdc++-v3/include/std/expected > b/libstdc++-v3/include/std/expected > index 21522850d7ae..fe4e1ecbf0ec 100644 > --- a/libstdc++-v3/include/std/expected > +++ b/libstdc++-v3/include/std/expected > @@ -37,6 +37,7 @@ > #define __glibcxx_want_freestanding_expected > #define __glibcxx_want_constrained_equality > #define __glibcxx_want_constexpr_exceptions > +#define __glibcxx_want_hardened_expected > #include <bits/version.h> > > #ifdef __cpp_lib_expected // C++ >= 23 && __cpp_concepts >= 202002L > diff --git a/libstdc++-v3/include/std/forward_list > b/libstdc++-v3/include/std/forward_list > index ff0c58455cf5..e24c1573e0ad 100644 > --- a/libstdc++-v3/include/std/forward_list > +++ b/libstdc++-v3/include/std/forward_list > @@ -51,6 +51,7 @@ > #define __glibcxx_want_allocator_traits_is_always_equal > #define __glibcxx_want_containers_ranges > #define __glibcxx_want_erase_if > +#define __glibcxx_want_hardened_forward_list > #define __glibcxx_want_incomplete_container_elements > #define __glibcxx_want_list_remove_return_type > #define __glibcxx_want_nonmember_container_access > diff --git a/libstdc++-v3/include/std/inplace_vector > b/libstdc++-v3/include/std/inplace_vector > index 0096bd83a175..46a750943629 100644 > --- a/libstdc++-v3/include/std/inplace_vector > +++ b/libstdc++-v3/include/std/inplace_vector > @@ -32,6 +32,7 @@ > > #pragma GCC system_header > > +#define __glibcxx_want_hardened_inplace_vector > #define __glibcxx_want_inplace_vector > #include <bits/version.h> > > diff --git a/libstdc++-v3/include/std/iterator > b/libstdc++-v3/include/std/iterator > index 96696cc53593..3d2dc8bbe9e4 100644 > --- a/libstdc++-v3/include/std/iterator > +++ b/libstdc++-v3/include/std/iterator > @@ -71,6 +71,8 @@ > > #define __glibcxx_want_array_constexpr > #define __glibcxx_want_constexpr_iterator > +#define __glibcxx_want_hardened_common_iterator > +#define __glibcxx_want_hardened_counted_iterator > #define __glibcxx_want_make_reverse_iterator > #define __glibcxx_want_move_iterator_concept > #define __glibcxx_want_nonmember_container_access > diff --git a/libstdc++-v3/include/std/list b/libstdc++-v3/include/std/list > index a3e7c81680a9..29d8fce698bc 100644 > --- a/libstdc++-v3/include/std/list > +++ b/libstdc++-v3/include/std/list > @@ -75,6 +75,7 @@ > #define __glibcxx_want_allocator_traits_is_always_equal > #define __glibcxx_want_containers_ranges > #define __glibcxx_want_erase_if > +#define __glibcxx_want_hardened_list > #define __glibcxx_want_incomplete_container_elements > #define __glibcxx_want_list_remove_return_type > #define __glibcxx_want_nonmember_container_access > diff --git a/libstdc++-v3/include/std/mdspan > b/libstdc++-v3/include/std/mdspan > index adc1c0c64219..8545a1276fcd 100644 > --- a/libstdc++-v3/include/std/mdspan > +++ b/libstdc++-v3/include/std/mdspan > @@ -40,6 +40,7 @@ > > #define __glibcxx_want_mdspan > #define __glibcxx_want_aligned_accessor > +#define __glibcxx_want_hardened_mdspan > #define __glibcxx_want_submdspan > #include <bits/version.h> > > diff --git a/libstdc++-v3/include/std/memory > b/libstdc++-v3/include/std/memory > index cbe9f5ad2007..9343b3497315 100644 > --- a/libstdc++-v3/include/std/memory > +++ b/libstdc++-v3/include/std/memory > @@ -110,6 +110,7 @@ > #define __glibcxx_want_constexpr_dynamic_alloc > #define __glibcxx_want_constexpr_memory > #define __glibcxx_want_enable_shared_from_this > +#define __glibcxx_want_hardened_shared_ptr_array > #define __glibcxx_want_indirect > #define __glibcxx_want_is_sufficiently_aligned > #define __glibcxx_want_make_unique > diff --git a/libstdc++-v3/include/std/optional > b/libstdc++-v3/include/std/optional > index 8d6d049e8ccc..34fa547e5c10 100644 > --- a/libstdc++-v3/include/std/optional > +++ b/libstdc++-v3/include/std/optional > @@ -39,6 +39,7 @@ > #define __glibcxx_want_optional_range_support > #define __glibcxx_want_constrained_equality > #define __glibcxx_want_constexpr_exceptions > +#define __glibcxx_want_hardened_optional > #include <bits/version.h> > > #ifdef __cpp_lib_optional // C++ >= 17 > diff --git a/libstdc++-v3/include/std/ranges > b/libstdc++-v3/include/std/ranges > index 7d8b37f8c5cf..a0679fa9e5cc 100644 > --- a/libstdc++-v3/include/std/ranges > +++ b/libstdc++-v3/include/std/ranges > @@ -56,6 +56,7 @@ > #include <bits/refwrap.h> > > #define __glibcxx_want_algorithm_default_value_type > +#define __glibcxx_want_hardened_vector > #define __glibcxx_want_ranges > #define __glibcxx_want_ranges_as_const > #define __glibcxx_want_ranges_as_rvalue > diff --git a/libstdc++-v3/include/std/span b/libstdc++-v3/include/std/span > index aaa7a485be8c..2b978dad8a4d 100644 > --- a/libstdc++-v3/include/std/span > +++ b/libstdc++-v3/include/std/span > @@ -40,6 +40,7 @@ > > #define __glibcxx_want_span > #define __glibcxx_want_span_initializer_list > +#define __glibcxx_want_hardened_span > #include <bits/version.h> > > #ifdef __cpp_lib_span // C++ >= 20 && concepts > diff --git a/libstdc++-v3/include/std/stacktrace > b/libstdc++-v3/include/std/stacktrace > index 79941d93b88f..22d8b804a5e9 100644 > --- a/libstdc++-v3/include/std/stacktrace > +++ b/libstdc++-v3/include/std/stacktrace > @@ -34,6 +34,7 @@ > > #define __glibcxx_want_stacktrace > #define __glibcxx_want_formatters > +#define __glibcxx_want_hardened_basic_stacktrace > #include <bits/version.h> > > #ifdef __cpp_lib_stacktrace // C++ >= 23 && hosted && HAVE_STACKTRACE > diff --git a/libstdc++-v3/include/std/string > b/libstdc++-v3/include/std/string > index c2b37391fc7a..1a622b7aebd6 100644 > --- a/libstdc++-v3/include/std/string > +++ b/libstdc++-v3/include/std/string > @@ -72,6 +72,7 @@ > #define __glibcxx_want_constexpr_string > #define __glibcxx_want_containers_ranges > #define __glibcxx_want_erase_if > +#define __glibcxx_want_hardened_basic_string > #define __glibcxx_want_nonmember_container_access > #define __glibcxx_want_string_resize_and_overwrite > #define __glibcxx_want_string_subview > diff --git a/libstdc++-v3/include/std/string_view > b/libstdc++-v3/include/std/string_view > index 81b0011245b5..ce6aee290524 100644 > --- a/libstdc++-v3/include/std/string_view > +++ b/libstdc++-v3/include/std/string_view > @@ -40,6 +40,7 @@ > #define __glibcxx_want_constexpr_char_traits > #define __glibcxx_want_constexpr_string_view > #define __glibcxx_want_freestanding_string_view > +#define __glibcxx_want_hardened_basic_string_view > #define __glibcxx_want_starts_ends_with > #define __glibcxx_want_string_contains > #define __glibcxx_want_string_subview > diff --git a/libstdc++-v3/include/std/valarray > b/libstdc++-v3/include/std/valarray > index abb158d22c35..ef34fed07caa 100644 > --- a/libstdc++-v3/include/std/valarray > +++ b/libstdc++-v3/include/std/valarray > @@ -46,6 +46,9 @@ > #include <bits/range_access.h> > #endif > > +#define __glibcxx_want_hardened_valarray > +#include <bits/version.h> > + > namespace std _GLIBCXX_VISIBILITY(default) > { > _GLIBCXX_BEGIN_NAMESPACE_VERSION > diff --git a/libstdc++-v3/include/std/vector > b/libstdc++-v3/include/std/vector > index 343483e95191..86e42b22ea5b 100644 > --- a/libstdc++-v3/include/std/vector > +++ b/libstdc++-v3/include/std/vector > @@ -83,6 +83,7 @@ > #define __glibcxx_want_constexpr_vector > #define __glibcxx_want_containers_ranges > #define __glibcxx_want_erase_if > +#define __glibcxx_want_hardened_vector > #define __glibcxx_want_incomplete_container_elements > #define __glibcxx_want_nonmember_container_access > #include <bits/version.h> > diff --git > a/libstdc++-v3/testsuite/23_containers/array/tuple_interface/get_neg.cc > b/libstdc++-v3/testsuite/23_containers/array/tuple_interface/get_neg.cc > index c71ddf91f645..0772581226de 100644 > --- a/libstdc++-v3/testsuite/23_containers/array/tuple_interface/get_neg.cc > +++ b/libstdc++-v3/testsuite/23_containers/array/tuple_interface/get_neg.cc > @@ -26,6 +26,6 @@ int n1 = std::get<1>(a); > int n2 = std::get<1>(std::move(a)); > int n3 = std::get<1>(ca); > > -// { dg-error "static assertion failed" "" { target *-*-* } 396 } > -// { dg-error "static assertion failed" "" { target *-*-* } 405 } > -// { dg-error "static assertion failed" "" { target *-*-* } 414 } > +// { dg-error "static assertion failed" "" { target *-*-* } 397 } > +// { dg-error "static assertion failed" "" { target *-*-* } 406 } > +// { dg-error "static assertion failed" "" { target *-*-* } 415 } > -- > 2.54.0 > >
