libstdc++: Fix uses of _M_current in split_view's outer iterator
authorJonathan Wakely <jwakely@redhat.com>
Tue, 10 Mar 2020 22:15:58 +0000 (22:15 +0000)
committerJonathan Wakely <jwakely@redhat.com>
Tue, 10 Mar 2020 22:15:58 +0000 (22:15 +0000)
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
libstdc++-v3/include/std/ranges

index 0c447ff..7197663 100644 (file)
@@ -1,5 +1,9 @@
 2020-03-10  Jonathan Wakely  <jwakely@redhat.com>
 
+       * 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.
index 4dc7342..de120d6 100644 (file)
@@ -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;
          }