On Fri, May 2, 2025 at 1:06 PM Jonathan Wakely <jwak...@redhat.com> wrote:

> This was inspired by LWG 4245 but goes further. Anything which only
> reads or writes the _M_length member can be noexcept. That
> member is an iterator difference_type which means it's a signed integer
> type or the __max_diff_type integer-like class type, so all arithmetic
> and comparisons are non-throwing.
>
> libstdc++-v3/ChangeLog:
>
>         * include/bits/stl_iterator.h (counted_iterator): Add noexcept
>         to friend operators which only access the _M_length member.
> ---
>
> Tested x86_64-linux.
>
LGTM

>
>  libstdc++-v3/include/bits/stl_iterator.h | 12 ++++++------
>  1 file changed, 6 insertions(+), 6 deletions(-)
>
> diff --git a/libstdc++-v3/include/bits/stl_iterator.h
> b/libstdc++-v3/include/bits/stl_iterator.h
> index bed72955d0c..478a98fe8a4 100644
> --- a/libstdc++-v3/include/bits/stl_iterator.h
> +++ b/libstdc++-v3/include/bits/stl_iterator.h
> @@ -2511,17 +2511,17 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
>         [[nodiscard]]
>         friend constexpr iter_difference_t<_It2>
>         operator-(const counted_iterator& __x,
> -                 const counted_iterator<_It2>& __y)
> +                 const counted_iterator<_It2>& __y) noexcept
>         { return __y._M_length - __x._M_length; }
>
>        [[nodiscard]]
>        friend constexpr iter_difference_t<_It>
> -      operator-(const counted_iterator& __x, default_sentinel_t)
> +      operator-(const counted_iterator& __x, default_sentinel_t) noexcept
>        { return -__x._M_length; }
>
>        [[nodiscard]]
>        friend constexpr iter_difference_t<_It>
> -      operator-(default_sentinel_t, const counted_iterator& __y)
> +      operator-(default_sentinel_t, const counted_iterator& __y) noexcept
>        { return __y._M_length; }
>
>        constexpr counted_iterator&
> @@ -2548,19 +2548,19 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
>         [[nodiscard]]
>         friend constexpr bool
>         operator==(const counted_iterator& __x,
> -                  const counted_iterator<_It2>& __y)
> +                  const counted_iterator<_It2>& __y) noexcept
>         { return __x._M_length == __y._M_length; }
>
>        [[nodiscard]]
>        friend constexpr bool
> -      operator==(const counted_iterator& __x, default_sentinel_t)
> +      operator==(const counted_iterator& __x, default_sentinel_t) noexcept
>        { return __x._M_length == 0; }
>
>        template<common_with<_It> _It2>
>         [[nodiscard]]
>         friend constexpr strong_ordering
>         operator<=>(const counted_iterator& __x,
> -                   const counted_iterator<_It2>& __y)
> +                   const counted_iterator<_It2>& __y) noexcept
>         { return __y._M_length <=> __x._M_length; }
>
>        [[nodiscard]]
> --
> 2.49.0
>
>

Reply via email to