This needs to wait for GCC 17

On Thu, 2 Apr 2026, 06:24 François Dumont, <[email protected]> wrote:

> As part of my patch to do some _GLIBCXX_DEBUG checks in  constant
> evaluation context:
>
> https://gcc.gnu.org/pipermail/libstdc++/2026-January/065132.html
>
> was also an occasion to optimize this mode for the most basic checks on
> iterators that are singularity and comparability. Those can now be
> inlined instead of going through a library call.
>
> In this patch I've isolated just those bits that won't have any impact
> on constant evaluation. It will just call new _M_attach_to and
> _M_detach_sequence that are doing nothing if in constant evaluation.
>
> As you'll see it also does some code simplifications and mark many
> function as C++20 constexpr.
>
>
>      libstdc++: [_GLIBCXX_DEBUG] Make constant evaluation compatible
>
>      Inline the most basic _GLIBCXX_DEBUG iterator checks _M_singular
> and _M_can_compare.
>      In addition to being an optimization it also make those usable in a
> constant evaluated
>      context.
>
>      Provide also a C++20 constexpr _Safe_iterator_base _M_attach_to and
> _M_detach_sequence
>      to call instead of respectively _M_attach and _M_detach that will
> serve maybe later
>      to have some _GLIBCXX_DEBUG checks in constexpr expressions.
>
>      Thanks to those changes make most of _GLIBCXX_DEBUG checks C++20
> constexpr.
>
>      libstdc++-v3/ChangeLog:
>
>              * include/debug/forward_list (_Sequence_traits<>::_S_size):
> Declare as C++20
>              constexpr.
>              * include/debug/functions.h
>              (__foreign_iterator): Declare as C++20 constexpr and add
> std::__is_constant_evaluated
>              check.
>              * include/debug/helper_functions.h (__check_singular_aux):
> Declare as C++20 constexpr.
>              * include/debug/list (_Sequence_traits<>::_S_size): Likewise.
>              * include/debug/safe_base.h
>              (_Safe_iterator_base::_M_attach_to): New, C++20 constexpr.
>              (_Safe_iterator_base(const _Safe_sequence_base*, bool):
> Adapt to use latter without
>              __is_constant_evaluated check.
>              (_Safe_iterator_base(const _Safe_iterator_base&, bool)):
> Likewise.
>              (_Safe_iterator_base::_M_detach_sequence): New, C++20
> constexpr.
>              (~_Safe_iterator_base()): Adapt to use latter without
> __is_constant_evaluated check.
>              (_Safe_iterator_base::_M_singular): Move private.
>              (_Safe_iterator_base::_M_can_compare): Move private.
>              (__check_singular_aux(const _Safe_iterator_base*)): Declare
> as C++20 constexpr and
>              implement as such.
>              * include/debug/safe_iterator.h
>              (_BeforeBeginHelper<>::_S_Is): Declare as C++20 constexpr.
>              (_BeforeBeginHelper<>::_S_Is_Beginnest): Likewise.
>              (_Sequence_traits<>::_S_size): Likewise.
>              (_Safe_iterator::_Iter_base, _Safe_iterator::_Safe_base):
> Remove.
>              (_Safe_iterator(const _Safe_iterator&, _Unchecked)):
> Delegate to correct base classes
>              constructors.
>              (_Safe_iterator::_M_singular()): New, C++20 constexpr.
>              (_Safe_iterator::_M_can_compare(const
> _Safe_iterator_base&)): New, C++20 constexpr.
>              (_Safe_iterator::_M_attach()): Declare as C++20 constexpr,
> use base class
>              _M_attach_to().
>              (_Safe_iterator::_M_detach()): New, C++20 constexpr, use
> base class _M_detach_sequence().
>              (_Safe_iterator::_M_dereferenceable): Declare as C++20
> constexpr.
>              (_Safe_iterator::_M_before_dereferenceable): Likewise.
>              (_Safe_iterator::_M_incrementable): Likewise.
>              (_Safe_iterator::_M_value_initialized): Likewise.
>              (_Safe_iterator::_M_can_advance): Likewise.
>              (_Safe_iterator::_M_valid_range): Likewise.
>              (_Safe_iterator::_M_get_sequence): Likewise.
>              (_Safe_iterator::_M_get_distance_from_begin): Likewise.
>              (_Safe_iterator::_M_get_distance_to_end): Likewise.
>              (_Safe_iterator::_M_is_end): Likewise.
>              (_Safe_iterator::_M_is_before_begin): Likewise.
>              (_Safe_iterator::_M_is_beginnest): Likewise.
>              (_Safe_iterator::operator++(int)):
>              Declare C++20 constexpr and add __is_constant_evaluated to
> skip debug check.
>              (_Safe_iterator::operator--(int)): Likewise.
>              (_Safe_iterator::_M_decrementable): Declare as C++20
> constexpr.
>              (_Safe_iterator::_M_valid_range): Declare as C++20 constexpr.
>              (operator<(const _Safe_iterator&, const _Safe_iterator&)):
> Likewise.
>              (operator<=(const _Safe_iterator&, const _Safe_iterator&)):
> Likewise.
>              (operator>(const _Safe_iterator&, const _Safe_iterator&)):
> Likewise.
>              (operator>=(const _Safe_iterator&, const _Safe_iterator&)):
> Likewise.
>              (operator+(const _Safe_iterator&, difference_type)): Likewise.
>              (operator+(difference_type, const _Safe_iterator&)): Likewise.
>              (operator-(const _Safe_iterator&, difference_type)): Likewise.
>              (operator-(difference_type, const _Safe_iterator&)): Likewise.
>              * include/debug/safe_iterator.tcc: Adapt method with C++20
> constexpr declaration.
>              * include/debug/safe_local_iterator.h
>              (_Safe_local_iterator::_Iter_base,
> _Safe_local_iterator::_Safe_base): Remove.
>              (_Safe_local_iterator(const _Safe_local_iterator&,
> _Unchecked)): Delegate to the correct
>              base classes constructors.
>              (_Safe_local_iterator::_M_singular): New.
>              (_Safe_local_iterator::_M_can_compare(const
> _Safe_iterator_base&)): New.
>
> Tested under Linux x86_64 _GLIBCXX_DEBUG mode.
>
> Ok to commit ?
>
> François
>
>

Reply via email to