From e5f1288fa0870291aeba423d8967efa0ffe2236e Mon Sep 17 00:00:00 2001 From: Marshall Clow Date: Sat, 7 Nov 2015 17:48:49 +0000 Subject: [PATCH] Implement LWG#2353: std::next is over-constrained llvm-svn: 252407 --- libcxx/include/iterator | 10 +++++----- .../iterator.operations/next.pass.cpp | 4 ++++ libcxx/www/cxx1z_status.html | 2 +- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/libcxx/include/iterator b/libcxx/include/iterator index c06ef8f6777d..8dd6bd59c1a8 100644 --- a/libcxx/include/iterator +++ b/libcxx/include/iterator @@ -513,12 +513,12 @@ distance(_InputIter __first, _InputIter __last) return __distance(__first, __last, typename iterator_traits<_InputIter>::iterator_category()); } -template +template inline _LIBCPP_INLINE_VISIBILITY -_ForwardIter -next(_ForwardIter __x, - typename iterator_traits<_ForwardIter>::difference_type __n = 1, - typename enable_if<__is_forward_iterator<_ForwardIter>::value>::type* = 0) +_InputIter +next(_InputIter __x, + typename iterator_traits<_InputIter>::difference_type __n = 1, + typename enable_if<__is_input_iterator<_InputIter>::value>::type* = 0) { _VSTD::advance(__x, __n); return __x; diff --git a/libcxx/test/std/iterators/iterator.primitives/iterator.operations/next.pass.cpp b/libcxx/test/std/iterators/iterator.primitives/iterator.operations/next.pass.cpp index f584110499b8..0952588b0cb1 100644 --- a/libcxx/test/std/iterators/iterator.primitives/iterator.operations/next.pass.cpp +++ b/libcxx/test/std/iterators/iterator.primitives/iterator.operations/next.pass.cpp @@ -12,6 +12,8 @@ // template // Iter next(Iter x, Iter::difference_type n = 1); +// LWG #2353 relaxed the requirement on next from ForwardIterator to InputIterator + #include #include @@ -34,11 +36,13 @@ test(It i, It x) int main() { const char* s = "1234567890"; + test(input_iterator(s), 10, input_iterator(s+10)); test(forward_iterator(s), 10, forward_iterator(s+10)); test(bidirectional_iterator(s), 10, bidirectional_iterator(s+10)); test(random_access_iterator(s), 10, random_access_iterator(s+10)); test(s, 10, s+10); + test(input_iterator(s), input_iterator(s+1)); test(forward_iterator(s), forward_iterator(s+1)); test(bidirectional_iterator(s), bidirectional_iterator(s+1)); test(random_access_iterator(s), random_access_iterator(s+1)); diff --git a/libcxx/www/cxx1z_status.html b/libcxx/www/cxx1z_status.html index 5617d877b14f..afd90505ddc4 100644 --- a/libcxx/www/cxx1z_status.html +++ b/libcxx/www/cxx1z_status.html @@ -164,7 +164,7 @@ 2259Issues in 17.6.5.5 rules for member functionsKonaComplete 2273regex_match ambiguityKona 2336is_trivially_constructible/is_trivially_assignable traits are always falseKona - 2353std::next is over-constrainedKona + 2353std::next is over-constrainedKonaComplete 2367pair and tuple are not correctly implemented for is_constructible with no argsKonaPatch Ready 2380May <cstdlib> provide long ::abs(long) and long long ::abs(long long)?KonaComplete 2384Allocator's deallocate function needs better specificationKonaComplete