From 0b7f1e24316cfc1f85408918d1734d3266d65089 Mon Sep 17 00:00:00 2001 From: Jonathan Wakely Date: Tue, 10 Mar 2020 22:15:58 +0000 Subject: [PATCH] libstdc++: Fix uses of _M_current in split_view's outer iterator These direct uses of _M_current should all be __current() so they are valid when the base type doesn't satisfy the forward_range concept. * include/std/ranges (split_view::_OuterIter::__at_end): Use __current instead of _M_current. (split_view::_OuterIter::operator++): Likewise. --- libstdc++-v3/ChangeLog | 4 ++++ libstdc++-v3/include/std/ranges | 14 +++++++------- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 0c447ff0806..7197663e6a1 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,5 +1,9 @@ 2020-03-10 Jonathan Wakely + * include/std/ranges (split_view::_OuterIter::__at_end): Use __current + instead of _M_current. + (split_view::_OuterIter::operator++): Likewise. + * include/std/ranges (transform_view::_Iterator::__iter_move): Remove. (transform_view::_Iterator::operator*): Add noexcept-specifier. (transform_view::_Iterator::iter_move): Inline __iter_move body here. diff --git a/libstdc++-v3/include/std/ranges b/libstdc++-v3/include/std/ranges index 4dc7342e2f7..de120d6b55d 100644 --- a/libstdc++-v3/include/std/ranges +++ b/libstdc++-v3/include/std/ranges @@ -2703,9 +2703,9 @@ namespace views constexpr bool __at_end() const - { return _M_current == ranges::end(_M_parent->_M_base); } + { return __current() == ranges::end(_M_parent->_M_base); } - // XXX: [24.7.11.3.1] + // [range.split.outer] p1 // Many of the following specifications refer to the notional member // current of outer-iterator. current is equivalent to current_ if // V models forward_range, and parent_->current_ otherwise. @@ -2798,21 +2798,21 @@ namespace views operator++() { const auto __end = ranges::end(_M_parent->_M_base); - if (_M_current == __end) + if (__current() == __end) return *this; const auto [__pbegin, __pend] = subrange{_M_parent->_M_pattern}; if (__pbegin == __pend) - ++_M_current; + ++__current(); else do { auto [__b, __p] - = __detail::mismatch(std::move(_M_current), __end, + = __detail::mismatch(std::move(__current()), __end, __pbegin, __pend); - _M_current = std::move(__b); + __current() = std::move(__b); if (__p == __pend) break; - } while (++_M_current != __end); + } while (++__current() != __end); return *this; } -- 2.30.2