diff --git a/stl/inc/ranges b/stl/inc/ranges index c00701026..1720c95ba 100644 --- a/stl/inc/ranges +++ b/stl/inc/ranges @@ -1515,9 +1515,12 @@ namespace ranges { template friend class _Sentinel; - using _Base_Ty = _Maybe_const<_Const, _Vw>; - using _Base_sentinel = _Maybe_wrapped<_Wrapped, sentinel_t<_Base_Ty>>; - using _Counted_Iter = counted_iterator<_Maybe_wrapped<_Wrapped, iterator_t<_Base_Ty>>>; + using _Base_t = _Maybe_const<_Const, _Vw>; + using _Base_sentinel = _Maybe_wrapped<_Wrapped, sentinel_t<_Base_t>>; + template + using _Base_iterator = _Maybe_wrapped<_Wrapped, iterator_t<_Maybe_const<_OtherConst, _Vw>>>; + template + using _Counted_iter = counted_iterator<_Base_iterator<_OtherConst>>; _Base_sentinel _Last{}; @@ -1540,7 +1543,16 @@ namespace ranges { return _Last; } - _NODISCARD friend constexpr bool operator==(const _Counted_Iter& _Left, const _Sentinel& _Right) { + _NODISCARD friend constexpr bool operator==(const _Counted_iter<_Const>& _Left, const _Sentinel& _Right) { + return _Left.count() == 0 || _Left.base() == _Right._Last; + } + + // clang-format off + template + requires sentinel_for<_Base_sentinel, _Base_iterator<_OtherConst>> + _NODISCARD friend constexpr bool operator==( + const _Counted_iter<_OtherConst>& _Left, const _Sentinel& _Right) { + // clang-format on return _Left.count() == 0 || _Left.base() == _Right._Last; } @@ -1548,17 +1560,17 @@ namespace ranges { // clang-format off _NODISCARD constexpr auto _Unwrapped() const& - requires _Wrapped && _Unwrappable_v&> { + requires _Wrapped && _Unwrappable_v&> { // clang-format on return _Sentinel<_Const, false>{_Get_unwrapped(_Last)}; } // clang-format off - _NODISCARD constexpr auto _Unwrapped() && requires _Wrapped && _Unwrappable_v> { + _NODISCARD constexpr auto _Unwrapped() && requires _Wrapped && _Unwrappable_v> { // clang-format on return _Sentinel<_Const, false>{_Get_unwrapped(_STD move(_Last))}; } - static constexpr bool _Unwrap_when_unverified = _Do_unwrap_when_unverified_v>; + static constexpr bool _Unwrap_when_unverified = _Do_unwrap_when_unverified_v>; constexpr void _Seek_to(const _Sentinel<_Const, false>& _That) requires _Wrapped { _Seek_wrapped(_Last, _That._Last); @@ -1753,9 +1765,9 @@ namespace ranges { template friend class _Sentinel; - using _Base_Ty = _Maybe_const<_Const, _Vw>; - using _Base_iterator = _Maybe_wrapped<_Wrapped, iterator_t<_Base_Ty>>; - using _Base_sentinel = _Maybe_wrapped<_Wrapped, sentinel_t<_Base_Ty>>; + using _Base_t = _Maybe_const<_Const, _Vw>; + using _Base_iterator = _Maybe_wrapped<_Wrapped, iterator_t<_Base_t>>; + using _Base_sentinel = _Maybe_wrapped<_Wrapped, sentinel_t<_Base_t>>; template using _Maybe_const_iter = _Maybe_wrapped<_Wrapped, iterator_t<_Maybe_const<_OtherConst, _Vw>>>; @@ -1799,17 +1811,17 @@ namespace ranges { // clang-format off _NODISCARD constexpr auto _Unwrapped() const& - requires _Wrapped && _Unwrappable_v&> { + requires _Wrapped && _Unwrappable_v&> { // clang-format on return _Sentinel<_Const, false>{_Get_unwrapped(_Last), _Pred}; } // clang-format off - _NODISCARD constexpr auto _Unwrapped() && requires _Wrapped && _Unwrappable_v> { + _NODISCARD constexpr auto _Unwrapped() && requires _Wrapped && _Unwrappable_v> { // clang-format on return _Sentinel<_Const, false>{_Get_unwrapped(_STD move(_Last)), _Pred}; } - static constexpr bool _Unwrap_when_unverified = _Do_unwrap_when_unverified_v>; + static constexpr bool _Unwrap_when_unverified = _Do_unwrap_when_unverified_v>; constexpr void _Seek_to(const _Sentinel<_Const, false>& _That) requires _Wrapped { _Seek_wrapped(_Last, _That._Last); diff --git a/tests/std/tests/P0896R4_views_take/test.cpp b/tests/std/tests/P0896R4_views_take/test.cpp index ea8c45373..27ccb1b7c 100644 --- a/tests/std/tests/P0896R4_views_take/test.cpp +++ b/tests/std/tests/P0896R4_views_take/test.cpp @@ -282,15 +282,25 @@ constexpr bool test_one(Rng&& rng, Expected&& expected) { } STATIC_ASSERT(CanEnd == range); if (!is_empty) { - same_as> auto i = r.end(); + same_as> auto s = r.end(); if constexpr (bidirectional_range && common_range) { - assert(*prev(i) == *prev(end(expected))); + assert(*prev(s) == *prev(end(expected))); } if constexpr (range) { - same_as> auto i2 = as_const(r).end(); + same_as> auto sc = as_const(r).end(); if constexpr (bidirectional_range && common_range) { - assert(*prev(i2) == *prev(end(expected))); + assert(*prev(sc) == *prev(end(expected))); + } + + if (forward_range) { // intentionally not if constexpr + // Compare with const / non-const iterators + const same_as> auto i = r.begin(); + const same_as> auto ic = as_const(r).begin(); + assert(s != i); + assert(s != ic); + assert(sc != i); + assert(sc != ic); } } }