From 10a618afe88ed16a9662316d2f5ff51d6041f4c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ion=20Gazta=C3=B1aga?= Date: Sat, 10 Nov 2018 23:12:46 +0100 Subject: [PATCH] Fix GitHub #83: ("Iterator zero incrementing leads to assert on empty vector") --- doc/container.qbk | 1 + include/boost/container/vector.hpp | 10 +++++----- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/doc/container.qbk b/doc/container.qbk index 14070de..84c9f3f 100644 --- a/doc/container.qbk +++ b/doc/container.qbk @@ -1253,6 +1253,7 @@ use [*Boost.Container]? There are several reasons for that: * Fixed bugs: * [@https://github.com/boostorg/container/issues/82 GitHub #82: ['"Function definition in header file"]]. + * [@https://github.com/boostorg/container/issues/83 GitHub #83: ['"Iterator zero incrementing leads to assert on empty vector"]]. * [@https://github.com/boostorg/container/pull/86 GitHub #86: ['"Add missing warning re-enabling include"]]. [endsect] diff --git a/include/boost/container/vector.hpp b/include/boost/container/vector.hpp index 8b863ab..19cbaed 100644 --- a/include/boost/container/vector.hpp +++ b/include/boost/container/vector.hpp @@ -145,19 +145,19 @@ class vec_iterator //Arithmetic BOOST_CONTAINER_FORCEINLINE vec_iterator& operator+=(difference_type off) BOOST_NOEXCEPT_OR_NOTHROW - { BOOST_ASSERT(!!m_ptr); m_ptr += off; return *this; } + { BOOST_ASSERT(m_ptr || !off); m_ptr += off; return *this; } BOOST_CONTAINER_FORCEINLINE vec_iterator& operator-=(difference_type off) BOOST_NOEXCEPT_OR_NOTHROW - { BOOST_ASSERT(!!m_ptr); m_ptr -= off; return *this; } + { BOOST_ASSERT(m_ptr || !off); m_ptr -= off; return *this; } BOOST_CONTAINER_FORCEINLINE friend vec_iterator operator+(const vec_iterator &x, difference_type off) BOOST_NOEXCEPT_OR_NOTHROW - { BOOST_ASSERT(!!x.m_ptr); return vec_iterator(x.m_ptr+off); } + { BOOST_ASSERT(x.m_ptr || !off); return vec_iterator(x.m_ptr+off); } BOOST_CONTAINER_FORCEINLINE friend vec_iterator operator+(difference_type off, vec_iterator right) BOOST_NOEXCEPT_OR_NOTHROW - { BOOST_ASSERT(!!right.m_ptr); right.m_ptr += off; return right; } + { BOOST_ASSERT(right.m_ptr || !off); right.m_ptr += off; return right; } BOOST_CONTAINER_FORCEINLINE friend vec_iterator operator-(vec_iterator left, difference_type off) BOOST_NOEXCEPT_OR_NOTHROW - { BOOST_ASSERT(!!left.m_ptr); left.m_ptr -= off; return left; } + { BOOST_ASSERT(left.m_ptr || !off); left.m_ptr -= off; return left; } BOOST_CONTAINER_FORCEINLINE friend difference_type operator-(const vec_iterator &left, const vec_iterator& right) BOOST_NOEXCEPT_OR_NOTHROW { return left.m_ptr - right.m_ptr; }