jasonliu created this revision. Creating a function pointer with proper parameters pointing to std::next() or std::prev() should work. This change moves the invented paramater for enable_if over to the return type to resolve this QoI issue.
https://reviews.llvm.org/D34649 Files: include/iterator test/std/iterators/iterator.primitives/iterator.operations/next.pass.cpp test/std/iterators/iterator.primitives/iterator.operations/prev.pass.cpp Index: test/std/iterators/iterator.primitives/iterator.operations/prev.pass.cpp =================================================================== --- test/std/iterators/iterator.primitives/iterator.operations/prev.pass.cpp +++ test/std/iterators/iterator.primitives/iterator.operations/prev.pass.cpp @@ -22,6 +22,9 @@ test(It i, typename std::iterator_traits<It>::difference_type n, It x) { assert(std::prev(i, n) == x); + + It (*prev)(It, typename std::iterator_traits<It>::difference_type) = std::prev; + assert(prev(i, n) == x); } template <class It> Index: test/std/iterators/iterator.primitives/iterator.operations/next.pass.cpp =================================================================== --- test/std/iterators/iterator.primitives/iterator.operations/next.pass.cpp +++ test/std/iterators/iterator.primitives/iterator.operations/next.pass.cpp @@ -24,6 +24,9 @@ test(It i, typename std::iterator_traits<It>::difference_type n, It x) { assert(std::next(i, n) == x); + + It (*next)(It, typename std::iterator_traits<It>::difference_type) = std::next; + assert(next(i, n) == x); } template <class It> Index: include/iterator =================================================================== --- include/iterator +++ include/iterator @@ -604,21 +604,27 @@ template <class _InputIter> inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 -_InputIter +typename enable_if +< + __is_input_iterator<_InputIter>::value, + _InputIter +>::type next(_InputIter __x, - typename iterator_traits<_InputIter>::difference_type __n = 1, - typename enable_if<__is_input_iterator<_InputIter>::value>::type* = 0) + typename iterator_traits<_InputIter>::difference_type __n = 1) { _VSTD::advance(__x, __n); return __x; } template <class _BidiretionalIter> inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 -_BidiretionalIter +typename enable_if +< + __is_bidirectional_iterator<_BidiretionalIter>::value, + _BidiretionalIter +>::type prev(_BidiretionalIter __x, - typename iterator_traits<_BidiretionalIter>::difference_type __n = 1, - typename enable_if<__is_bidirectional_iterator<_BidiretionalIter>::value>::type* = 0) + typename iterator_traits<_BidiretionalIter>::difference_type __n = 1) { _VSTD::advance(__x, -__n); return __x;
Index: test/std/iterators/iterator.primitives/iterator.operations/prev.pass.cpp =================================================================== --- test/std/iterators/iterator.primitives/iterator.operations/prev.pass.cpp +++ test/std/iterators/iterator.primitives/iterator.operations/prev.pass.cpp @@ -22,6 +22,9 @@ test(It i, typename std::iterator_traits<It>::difference_type n, It x) { assert(std::prev(i, n) == x); + + It (*prev)(It, typename std::iterator_traits<It>::difference_type) = std::prev; + assert(prev(i, n) == x); } template <class It> Index: test/std/iterators/iterator.primitives/iterator.operations/next.pass.cpp =================================================================== --- test/std/iterators/iterator.primitives/iterator.operations/next.pass.cpp +++ test/std/iterators/iterator.primitives/iterator.operations/next.pass.cpp @@ -24,6 +24,9 @@ test(It i, typename std::iterator_traits<It>::difference_type n, It x) { assert(std::next(i, n) == x); + + It (*next)(It, typename std::iterator_traits<It>::difference_type) = std::next; + assert(next(i, n) == x); } template <class It> Index: include/iterator =================================================================== --- include/iterator +++ include/iterator @@ -604,21 +604,27 @@ template <class _InputIter> inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 -_InputIter +typename enable_if +< + __is_input_iterator<_InputIter>::value, + _InputIter +>::type next(_InputIter __x, - typename iterator_traits<_InputIter>::difference_type __n = 1, - typename enable_if<__is_input_iterator<_InputIter>::value>::type* = 0) + typename iterator_traits<_InputIter>::difference_type __n = 1) { _VSTD::advance(__x, __n); return __x; } template <class _BidiretionalIter> inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 -_BidiretionalIter +typename enable_if +< + __is_bidirectional_iterator<_BidiretionalIter>::value, + _BidiretionalIter +>::type prev(_BidiretionalIter __x, - typename iterator_traits<_BidiretionalIter>::difference_type __n = 1, - typename enable_if<__is_bidirectional_iterator<_BidiretionalIter>::value>::type* = 0) + typename iterator_traits<_BidiretionalIter>::difference_type __n = 1) { _VSTD::advance(__x, -__n); return __x;
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits