aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Wakely <jwakely@redhat.com>2020-09-10 17:09:15 +0100
committerJonathan Wakely <jwakely@redhat.com>2020-09-10 17:09:15 +0100
commitafea21f9612545282db95872021d7587c9d5b0d4 (patch)
tree8ae10a4d9b96a41e0b9a8d40a4fb56e3b51f4276
parent0ed757604f4e232324ca798e46f3d8bf7e35b009 (diff)
downloadgcc-afea21f9612545282db95872021d7587c9d5b0d4.zip
gcc-afea21f9612545282db95872021d7587c9d5b0d4.tar.gz
gcc-afea21f9612545282db95872021d7587c9d5b0d4.tar.bz2
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.
-rw-r--r--libstdc++-v3/include/bits/stl_iterator.h20
1 files changed, 16 insertions, 4 deletions
diff --git a/libstdc++-v3/include/bits/stl_iterator.h b/libstdc++-v3/include/bits/stl_iterator.h
index da740e3..f29bae9 100644
--- a/libstdc++-v3/include/bits/stl_iterator.h
+++ b/libstdc++-v3/include/bits/stl_iterator.h
@@ -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;