On Fri, 19 Dec 2025, 12:26 Tomasz Kamiński, <[email protected]> wrote:

> This functions are indirectly called from flat_ containers operations
> (from preconditions check of lower_bound, upper_bound, ...) that were
> made constexpr by r16-6026-gbf9dd44a97400e, leading to test with
> in _GLIBCXX_DEBUG mode.
>
> For __can_advance we uncoditionally return true in constant evaluation,
> similary to __valid_range. The constexpr iterator will detect comparision
> of iterator to different ranges.
>

Thanks for fixing this! Our test results should be clean now.




> libstdc++-v3/ChangeLog:
>
>         * include/debug/helper_functions.h (__gnu_debug::__can_advance):
>         Declare as _GLIBCXX20_CONSTEXPR.
>         * include/debug/safe_iterator.h (__gnu_debug::__can_advance):
>         Define as _GLIBCXX20_CONSTEXPR, and return true for constexpr
>         evaluation.
>         (__gnu_debug::__base): Define as _GLIBCXX20_CONSTEXPR.
> ---
> Tested on x86_64-linux. Pushed to trunk.
>
>  libstdc++-v3/include/debug/helper_functions.h |  4 ++--
>  libstdc++-v3/include/debug/safe_iterator.h    | 18 +++++++++++++++---
>  2 files changed, 17 insertions(+), 5 deletions(-)
>
> diff --git a/libstdc++-v3/include/debug/helper_functions.h
> b/libstdc++-v3/include/debug/helper_functions.h
> index b9771034bf3..b058408a1e3 100644
> --- a/libstdc++-v3/include/debug/helper_functions.h
> +++ b/libstdc++-v3/include/debug/helper_functions.h
> @@ -292,7 +292,7 @@ namespace __gnu_debug
>
>    template<typename _Iterator, typename _Sequence, typename _Category,
>            typename _Size>
> -    bool
> +    _GLIBCXX20_CONSTEXPR bool
>      __can_advance(const _Safe_iterator<_Iterator, _Sequence, _Category>&,
>                   _Size);
>
> @@ -304,7 +304,7 @@ namespace __gnu_debug
>
>    template<typename _Iterator, typename _Sequence, typename _Category,
>            typename _Diff>
> -    bool
> +    _GLIBCXX20_CONSTEXPR bool
>      __can_advance(const _Safe_iterator<_Iterator, _Sequence, _Category>&,
>                   const std::pair<_Diff, _Distance_precision>&, int);
>
> diff --git a/libstdc++-v3/include/debug/safe_iterator.h
> b/libstdc++-v3/include/debug/safe_iterator.h
> index 80ed9570ecb..ef61ab5e026 100644
> --- a/libstdc++-v3/include/debug/safe_iterator.h
> +++ b/libstdc++-v3/include/debug/safe_iterator.h
> @@ -1145,21 +1145,33 @@ namespace __gnu_debug
>
>    template<typename _Iterator, typename _Sequence, typename _Category,
>            typename _Size>
> +    _GLIBCXX20_CONSTEXPR
>      inline bool
>      __can_advance(const _Safe_iterator<_Iterator, _Sequence, _Category>&
> __it,
>                   _Size __n)
> -    { return __it._M_can_advance(__n); }
> +    {
> +      if (std::__is_constant_evaluated())
> +       return true;
> +
> +      return __it._M_can_advance(__n);
> +    }
>
>    template<typename _Iterator, typename _Sequence, typename _Category,
>            typename _Diff>
> +    _GLIBCXX20_CONSTEXPR
>      inline bool
>      __can_advance(const _Safe_iterator<_Iterator, _Sequence, _Category>&
> __it,
>                   const std::pair<_Diff, _Distance_precision>& __dist,
>                   int __way)
> -    { return __it._M_can_advance(__dist, __way); }
> +    {
> +      if (std::__is_constant_evaluated())
> +       return true;
> +
> +      return __it._M_can_advance(__dist, __way);
> +    }
>
>    template<typename _Iterator, typename _Sequence>
> -    _Iterator
> +    _GLIBCXX20_CONSTEXPR _Iterator
>      __base(const _Safe_iterator<_Iterator, _Sequence,
>                                 std::random_access_iterator_tag>& __it)
>      { return __it.base(); }
> --
> 2.52.0
>
>

Reply via email to