On Thu, 20 May 2021, 19:35 Patrick Palka via Libstdc++, < libstd...@gcc.gnu.org> wrote:
> Tested on x86_64-pc-linux-gnu, does this look OK for trunk/11/10? > Yes/yes/yes Thanks. > > libstdc++-v3/ChangeLog: > > PR libstdc++/100690 > * include/std/ranges (iota_view::_Sentinel::_M_distance_from): > Split out into this member function from ... > (iota_view::_Sentinel::operator-): ... here, for sake of access > checking. > * testsuite/std/ranges/iota/iota_view.cc: > --- > libstdc++-v3/include/std/ranges | 8 ++++++-- > libstdc++-v3/testsuite/std/ranges/iota/iota_view.cc | 11 +++++++++++ > 2 files changed, 17 insertions(+), 2 deletions(-) > > diff --git a/libstdc++-v3/include/std/ranges > b/libstdc++-v3/include/std/ranges > index 704f924557c..76add252ca6 100644 > --- a/libstdc++-v3/include/std/ranges > +++ b/libstdc++-v3/include/std/ranges > @@ -499,6 +499,10 @@ namespace ranges > _M_equal(const _Iterator& __x) const > { return __x._M_value == _M_bound; } > > + constexpr auto > + _M_distance_from(const _Iterator& __x) const > + { return _M_bound - __x._M_value; } > + > _Bound _M_bound = _Bound(); > > public: > @@ -515,12 +519,12 @@ namespace ranges > friend constexpr iter_difference_t<_Winc> > operator-(const _Iterator& __x, const _Sentinel& __y) > requires sized_sentinel_for<_Bound, _Winc> > - { return __x._M_value - __y._M_bound; } > + { return -__y._M_distance_from(__x); } > > friend constexpr iter_difference_t<_Winc> > operator-(const _Sentinel& __x, const _Iterator& __y) > requires sized_sentinel_for<_Bound, _Winc> > - { return -(__y - __x); } > + { return __x._M_distance_from(__y); } > }; > > _Winc _M_value = _Winc(); > diff --git a/libstdc++-v3/testsuite/std/ranges/iota/iota_view.cc > b/libstdc++-v3/testsuite/std/ranges/iota/iota_view.cc > index be8695120ad..362ef1f7f78 100644 > --- a/libstdc++-v3/testsuite/std/ranges/iota/iota_view.cc > +++ b/libstdc++-v3/testsuite/std/ranges/iota/iota_view.cc > @@ -80,6 +80,16 @@ test04() > // Verify we optimize away the 'bound' data member of an unbounded > iota_view. > static_assert(sizeof(std::ranges::iota_view<char>) == 1); > > +void > +test05() > +{ > + // PR libstdc++/100690 > + int x[] = {42, 42, 42}; > + auto r = std::views::iota(std::ranges::begin(x), std::ranges::cbegin(x) > + 3); > + VERIFY( r.end() - r.begin() == 3 ); > + VERIFY( r.begin() - r.end() == -3 ); > +} > + > int > main() > { > @@ -87,4 +97,5 @@ main() > test02(); > test03(); > test04(); > + test05(); > } > -- > 2.32.0.rc0 > >