@@ -64,14 +64,23 @@ struct forward_iterator_tag : public input_iterator_tag {};
6464struct bidirectional_iterator_tag : public forward_iterator_tag {};
6565struct random_access_iterator_tag : public bidirectional_iterator_tag {};
6666
67+ // 27.4.3, iterator operations
6768// extension: second argument not conforming to C++03
68- template <class InputIterator>
69- void advance(InputIterator& i,
69+ template <class InputIterator> // constexpr in C++17
70+ constexpr void advance(InputIterator& i,
7071 typename iterator_traits<InputIterator>::difference_type n);
7172
72- template <class InputIterator>
73- typename iterator_traits<InputIterator>::difference_type
74- distance(InputIterator first, InputIterator last);
73+ template <class InputIterator> // constexpr in C++17
74+ constexpr typename iterator_traits<InputIterator>::difference_type
75+ distance(InputIterator first, InputIterator last);
76+
77+ template <class InputIterator> // constexpr in C++17
78+ constexpr InputIterator next(InputIterator x,
79+ typename iterator_traits<InputIterator>::difference_type n = 1);
80+
81+ template <class BidirectionalIterator> // constexpr in C++17
82+ constexpr BidirectionalIterator prev(BidirectionalIterator x,
83+ typename iterator_traits<BidirectionalIterator>::difference_type n = 1);
7584
7685template <class Iterator>
7786class reverse_iterator
@@ -529,7 +538,7 @@ struct _LIBCPP_TEMPLATE_VIS iterator
529538};
530539
531540template <class _InputIter >
532- inline _LIBCPP_INLINE_VISIBILITY
541+ inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
533542void __advance (_InputIter& __i,
534543 typename iterator_traits<_InputIter>::difference_type __n, input_iterator_tag)
535544{
@@ -538,7 +547,7 @@ void __advance(_InputIter& __i,
538547}
539548
540549template <class _BiDirIter >
541- inline _LIBCPP_INLINE_VISIBILITY
550+ inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
542551void __advance (_BiDirIter& __i,
543552 typename iterator_traits<_BiDirIter>::difference_type __n, bidirectional_iterator_tag)
544553{
@@ -551,23 +560,23 @@ void __advance(_BiDirIter& __i,
551560}
552561
553562template <class _RandIter >
554- inline _LIBCPP_INLINE_VISIBILITY
563+ inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
555564void __advance (_RandIter& __i,
556565 typename iterator_traits<_RandIter>::difference_type __n, random_access_iterator_tag)
557566{
558567 __i += __n;
559568}
560569
561570template <class _InputIter >
562- inline _LIBCPP_INLINE_VISIBILITY
571+ inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
563572void advance (_InputIter& __i,
564573 typename iterator_traits<_InputIter>::difference_type __n)
565574{
566575 __advance (__i, __n, typename iterator_traits<_InputIter>::iterator_category ());
567576}
568577
569578template <class _InputIter >
570- inline _LIBCPP_INLINE_VISIBILITY
579+ inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
571580typename iterator_traits<_InputIter>::difference_type
572581__distance (_InputIter __first, _InputIter __last, input_iterator_tag)
573582{
@@ -578,23 +587,23 @@ __distance(_InputIter __first, _InputIter __last, input_iterator_tag)
578587}
579588
580589template <class _RandIter >
581- inline _LIBCPP_INLINE_VISIBILITY
590+ inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
582591typename iterator_traits<_RandIter>::difference_type
583592__distance (_RandIter __first, _RandIter __last, random_access_iterator_tag)
584593{
585594 return __last - __first;
586595}
587596
588597template <class _InputIter >
589- inline _LIBCPP_INLINE_VISIBILITY
598+ inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
590599typename iterator_traits<_InputIter>::difference_type
591600distance (_InputIter __first, _InputIter __last)
592601{
593602 return __distance (__first, __last, typename iterator_traits<_InputIter>::iterator_category ());
594603}
595604
596605template <class _InputIter >
597- inline _LIBCPP_INLINE_VISIBILITY
606+ inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
598607_InputIter
599608next (_InputIter __x,
600609 typename iterator_traits<_InputIter>::difference_type __n = 1 ,
@@ -605,7 +614,7 @@ next(_InputIter __x,
605614}
606615
607616template <class _BidiretionalIter >
608- inline _LIBCPP_INLINE_VISIBILITY
617+ inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
609618_BidiretionalIter
610619prev (_BidiretionalIter __x,
611620 typename iterator_traits<_BidiretionalIter>::difference_type __n = 1 ,
0 commit comments