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
>
>

Reply via email to