[gcc r14-11578] libstdc++: Fix constraint recursion in basic_const_iterator operator- [PR115046]
Patrick Palka
ppalka@gcc.gnu.org
Wed Apr 9 21:59:39 GMT 2025
https://gcc.gnu.org/g:630bca9fa83236e108e9421549bdd5058133c3dd
commit r14-11578-g630bca9fa83236e108e9421549bdd5058133c3dd
Author: Patrick Palka <ppalka@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 <jwakely@redhat.com>
(cherry picked from commit d69f73c0334486f3c66937388f02008736809e87)
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 5e1fe30135ef..2162792782eb 100644
--- a/libstdc++-v3/include/bits/stl_iterator.h
+++ b/libstdc++-v3/include/bits/stl_iterator.h
@@ -2917,10 +2917,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();
}
More information about the Libstdc++-cvs
mailing list