libstdc++: Enforce LWG 3472 preconditions on std::counted_iterator

libstdc++-v3/ChangeLog:

	* include/bits/stl_iterator.h (counted_iterator): Add assertions
	to check preconditions added by LWG 3472.
This commit is contained in:
Jonathan Wakely 2020-09-10 17:09:15 +01:00
parent 0ed757604f
commit afea21f961
1 changed files with 16 additions and 4 deletions

View File

@ -2036,13 +2036,19 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
constexpr decltype(auto)
operator*()
noexcept(noexcept(*_M_current))
{ return *_M_current; }
{
__glibcxx_assert( _M_length > 0 );
return *_M_current;
}
constexpr decltype(auto)
operator*() const
noexcept(noexcept(*_M_current))
requires __detail::__dereferenceable<const _It>
{ return *_M_current; }
{
__glibcxx_assert( _M_length > 0 );
return *_M_current;
}
constexpr counted_iterator&
operator++()
@ -2170,14 +2176,20 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
iter_move(const counted_iterator& __i)
noexcept(noexcept(ranges::iter_move(__i._M_current)))
requires input_iterator<_It>
{ return ranges::iter_move(__i._M_current); }
{
__glibcxx_assert( __i._M_length > 0 );
return ranges::iter_move(__i._M_current);
}
template<indirectly_swappable<_It> _It2>
friend constexpr void
iter_swap(const counted_iterator& __x,
const counted_iterator<_It2>& __y)
noexcept(noexcept(ranges::iter_swap(__x._M_current, __y._M_current)))
{ ranges::iter_swap(__x._M_current, __y._M_current); }
{
__glibcxx_assert( __x._M_length > 0 && __y._M_length > 0 );
ranges::iter_swap(__x._M_current, __y._M_current);
}
private:
template<input_or_output_iterator _It2> friend class counted_iterator;