https://gcc.gnu.org/g:d69f73c0334486f3c66937388f02008736809e87

commit r15-9351-gd69f73c0334486f3c66937388f02008736809e87
Author: Patrick Palka <ppa...@redhat.com>
Date:   Wed Apr 9 17:48:05 2025 -0400

    libstdc++: Fix constraint recursion in basic_const_iterator operator- 
[PR115046]
    
    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
    will need to get adjusted too.
    
            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.
    
    Reviewed-by: Jonathan Wakely <jwak...@redhat.com>

Diff:
---
 libstdc++-v3/include/bits/stl_iterator.h                 |  4 ++--
 libstdc++-v3/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();
 }

Reply via email to