On Tue, 8 Apr 2025, 23:01 Patrick Palka, <ppa...@redhat.com> wrote:

> Tested on x86_64-pc-linux-gnu, does this look OK for trunk/14?
>

OK for both.


> -- >8 --
>
> It was proposed in PR112490 to also adjust basic_const_iterator's friend
> operator-(sent, iter) overload alongside the r15-7757-g4342c50ca84ae5
> adjustments to its comparison operators, but we lacked a concrete
> testcase demonstrating fixable constraint recursion there.  It turns out
> Hewill Kang's PR115046 is such a testcase!  So this patch makes the same
> adjustments to that overload as well, fixing PR115046.  The LWG 4218 P/R
> needs to get adjusted as well.
>

I was going to suggest updating the lwg issue, thanks.


>         PR libstdc++/115046
>         PR libstdc++/112490
>
> libstdc++-v3/ChangeLog:
>
>         * include/bits/stl_iterator.h (basic_const_iterator::operator-):
>         Replace non-dependent basic_const_iterator function parameter with
>         a dependent one of type basic_const_iterator<_It2> where _It2
>         matches _It.
>         * testsuite/std/ranges/adaptors/as_const/1.cc (test04): New test.
> ---
>  libstdc++-v3/include/bits/stl_iterator.h            |  4 ++--
>  .../testsuite/std/ranges/adaptors/as_const/1.cc     | 13 +++++++++++++
>  2 files changed, 15 insertions(+), 2 deletions(-)
>
> diff --git a/libstdc++-v3/include/bits/stl_iterator.h
> b/libstdc++-v3/include/bits/stl_iterator.h
> index 33732b1a4287..9203a66b2ff0 100644
> --- a/libstdc++-v3/include/bits/stl_iterator.h
> +++ b/libstdc++-v3/include/bits/stl_iterator.h
> @@ -2933,10 +2933,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
>        noexcept(noexcept(_M_current - __y))
>        { return _M_current - __y; }
>
> -    template<__detail::__not_a_const_iterator _Sent>
> +    template<__detail::__not_a_const_iterator _Sent, same_as<_It> _It2>
>        requires sized_sentinel_for<_Sent, _It>
>        friend constexpr difference_type
> -      operator-(const _Sent& __x, const basic_const_iterator& __y)
> +      operator-(const _Sent& __x, const basic_const_iterator<_It2>& __y)
>        noexcept(noexcept(__x - __y._M_current))
>        { return __x - __y._M_current; }
>
> diff --git a/libstdc++-v3/testsuite/std/ranges/adaptors/as_const/1.cc
> b/libstdc++-v3/testsuite/std/ranges/adaptors/as_const/1.cc
> index 3f1f8eb17726..5ccf47d4d300 100644
> --- a/libstdc++-v3/testsuite/std/ranges/adaptors/as_const/1.cc
> +++ b/libstdc++-v3/testsuite/std/ranges/adaptors/as_const/1.cc
> @@ -69,10 +69,23 @@ test03()
>      auto r2 = views::as_const(views::all(v));
>  }
>
> +void
> +test04()
> +{
> +  // PR libstdc++/115046 - meta-recursion with join_view and as_const_view
> +  int x[3] = {1,2,3};
> +  auto v = x
> +    | views::chunk(3)
> +    | views::transform(views::as_const)
> +    | views::join;
> +  VERIFY( ranges::equal(v, x) );
> +}
> +
>  int
>  main()
>  {
>    static_assert(test01());
>    static_assert(test02());
>    test03();
> +  test04();
>  }
> --
> 2.49.0.154.g9d22ac5122
>
>

Reply via email to