summaryrefslogtreecommitdiffstats
path: root/libcxx/include
diff options
context:
space:
mode:
authorMarshall Clow <mclow.lists@gmail.com>2019-03-22 22:32:20 +0000
committerMarshall Clow <mclow.lists@gmail.com>2019-03-22 22:32:20 +0000
commite1cd11d80f5929e916de861f83d672ab72e29046 (patch)
tree98a5d19f4081728c1fd8281778216a14497d5ef3 /libcxx/include
parent80ff58e37c96df05bd1811083267c9c53ef1b85f (diff)
downloadbcm5719-llvm-e1cd11d80f5929e916de861f83d672ab72e29046.tar.gz
bcm5719-llvm-e1cd11d80f5929e916de861f83d672ab72e29046.zip
Fix a minor bug with std::next and prev not and negative numbers. In particular, std::prev cannot require Bidirectional Iterators, because you might 'go back' -1 places, which goes forward. Thanks to Ville and Jonathan for the bug report.
llvm-svn: 356818
Diffstat (limited to 'libcxx/include')
-rw-r--r--libcxx/include/iterator17
1 files changed, 12 insertions, 5 deletions
diff --git a/libcxx/include/iterator b/libcxx/include/iterator
index 16c1bcb76c8..5846c1b494f 100644
--- a/libcxx/include/iterator
+++ b/libcxx/include/iterator
@@ -584,6 +584,8 @@ inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
void advance(_InputIter& __i,
typename iterator_traits<_InputIter>::difference_type __n)
{
+ _LIBCPP_ASSERT(__n >= 0 || __is_bidirectional_iterator<_InputIter>::value,
+ "Attempt to advance(it, -n) on a non-bidi iterator");
__advance(__i, __n, typename iterator_traits<_InputIter>::iterator_category());
}
@@ -624,20 +626,25 @@ typename enable_if
next(_InputIter __x,
typename iterator_traits<_InputIter>::difference_type __n = 1)
{
+ _LIBCPP_ASSERT(__n >= 0 || __is_bidirectional_iterator<_InputIter>::value,
+ "Attempt to next(it, -n) on a non-bidi iterator");
+
_VSTD::advance(__x, __n);
return __x;
}
-template <class _BidirectionalIter>
+template <class _InputIter>
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
typename enable_if
<
- __is_bidirectional_iterator<_BidirectionalIter>::value,
- _BidirectionalIter
+ __is_input_iterator<_InputIter>::value,
+ _InputIter
>::type
-prev(_BidirectionalIter __x,
- typename iterator_traits<_BidirectionalIter>::difference_type __n = 1)
+prev(_InputIter __x,
+ typename iterator_traits<_InputIter>::difference_type __n = 1)
{
+ _LIBCPP_ASSERT(__n <= 0 || __is_bidirectional_iterator<_InputIter>::value,
+ "Attempt to prev(it, +n) on a non-bidi iterator");
_VSTD::advance(__x, -__n);
return __x;
}
OpenPOWER on IntegriCloud