Please ping for review after GCC 16 is released. On Thu, 2 Apr 2026, 07:44 Jonathan Wakely, <[email protected]> wrote:
> 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 >> >>
