libstdc++: Fix access issue in iota_view::_Sentinel [PR100690]
libstdc++-v3/ChangeLog:
PR libstdc++/100690
* include/std/ranges (iota_view::_Sentinel::_M_distance_from):
Split out this member function from ...
(iota_view::_Sentinel::operator-): ... here, for sake of access
control.
* testsuite/std/ranges/iota/iota_view.cc (test05): New test.
(cherry picked from commit 317a38cd46
)
This commit is contained in:
parent
e3804ba98f
commit
c6ccaf17dd
@ -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();
|
||||
|
@ -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();
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user