Index: include/iterator =================================================================== --- include/iterator +++ include/iterator @@ -89,57 +89,60 @@ typedef typename iterator_traits::reference reference; typedef typename iterator_traits::pointer pointer; - reverse_iterator(); - explicit reverse_iterator(Iterator x); - template reverse_iterator(const reverse_iterator& u); - Iterator base() const; - reference operator*() const; - pointer operator->() const; - reverse_iterator& operator++(); - reverse_iterator operator++(int); - reverse_iterator& operator--(); - reverse_iterator operator--(int); - reverse_iterator operator+ (difference_type n) const; - reverse_iterator& operator+=(difference_type n); - reverse_iterator operator- (difference_type n) const; - reverse_iterator& operator-=(difference_type n); - reference operator[](difference_type n) const; + constexpr reverse_iterator(); + constexpr explicit reverse_iterator(Iterator x); + template constexpr reverse_iterator(const reverse_iterator& u); + template constexpr reverse_iterator& operator (const reverse_iterator& u); + constexpr Iterator base() const; + constexpr reference operator*() const; + constexpr pointer operator->() const; + constexpr reverse_iterator& operator++(); + constexpr reverse_iterator operator++(int); + constexpr reverse_iterator& operator--(); + constexpr reverse_iterator operator--(int); + constexpr reverse_iterator operator+ (difference_type n) const; + constexpr reverse_iterator& operator+=(difference_type n); + constexpr reverse_iterator operator- (difference_type n) const; + constexpr reverse_iterator& operator-=(difference_type n); + constexpr reference operator[](difference_type n) const; }; template -bool +constexpr bool // constexpr in C++17 operator==(const reverse_iterator& x, const reverse_iterator& y); template -bool +constexpr bool // constexpr in C++17 operator<(const reverse_iterator& x, const reverse_iterator& y); template -bool +constexpr bool // constexpr in C++17 operator!=(const reverse_iterator& x, const reverse_iterator& y); template -bool +constexpr bool // constexpr in C++17 operator>(const reverse_iterator& x, const reverse_iterator& y); template -bool +constexpr bool // constexpr in C++17 operator>=(const reverse_iterator& x, const reverse_iterator& y); template -bool +constexpr bool // constexpr in C++17 operator<=(const reverse_iterator& x, const reverse_iterator& y); template -auto +constexpr auto operator-(const reverse_iterator& x, const reverse_iterator& y) --> decltype(__y.base() - __x.base()); +-> decltype(__y.base() - __x.base()); // constexpr in C++17 template -reverse_iterator -operator+(typename reverse_iterator::difference_type n, const reverse_iterator& x); +constexpr reverse_iterator +operator+(typename reverse_iterator::difference_type n, + const reverse_iterator& x); // constexpr in C++17 -template reverse_iterator make_reverse_iterator(Iterator i); // C++14 +template +constexpr reverse_iterator make_reverse_iterator(Iterator i); // C++14, constexpr in C++17 template class back_insert_iterator @@ -618,7 +621,7 @@ typename iterator_traits<_Iter>::reference> { private: - mutable _Iter __t; // no longer used as of LWG #2360, not removed due to ABI break + /*mutable*/ _Iter __t; // no longer used as of LWG #2360, not removed due to ABI break protected: _Iter current; public: @@ -627,33 +630,45 @@ typedef typename iterator_traits<_Iter>::reference reference; typedef typename iterator_traits<_Iter>::pointer pointer; - _LIBCPP_INLINE_VISIBILITY reverse_iterator() : current() {} - _LIBCPP_INLINE_VISIBILITY explicit reverse_iterator(_Iter __x) : __t(__x), current(__x) {} - template _LIBCPP_INLINE_VISIBILITY reverse_iterator(const reverse_iterator<_Up>& __u) - : __t(__u.base()), current(__u.base()) {} - _LIBCPP_INLINE_VISIBILITY _Iter base() const {return current;} - _LIBCPP_INLINE_VISIBILITY reference operator*() const {_Iter __tmp = current; return *--__tmp;} - _LIBCPP_INLINE_VISIBILITY pointer operator->() const {return _VSTD::addressof(operator*());} - _LIBCPP_INLINE_VISIBILITY reverse_iterator& operator++() {--current; return *this;} - _LIBCPP_INLINE_VISIBILITY reverse_iterator operator++(int) - {reverse_iterator __tmp(*this); --current; return __tmp;} - _LIBCPP_INLINE_VISIBILITY reverse_iterator& operator--() {++current; return *this;} - _LIBCPP_INLINE_VISIBILITY reverse_iterator operator--(int) - {reverse_iterator __tmp(*this); ++current; return __tmp;} - _LIBCPP_INLINE_VISIBILITY reverse_iterator operator+ (difference_type __n) const - {return reverse_iterator(current - __n);} - _LIBCPP_INLINE_VISIBILITY reverse_iterator& operator+=(difference_type __n) - {current -= __n; return *this;} - _LIBCPP_INLINE_VISIBILITY reverse_iterator operator- (difference_type __n) const - {return reverse_iterator(current + __n);} - _LIBCPP_INLINE_VISIBILITY reverse_iterator& operator-=(difference_type __n) - {current += __n; return *this;} - _LIBCPP_INLINE_VISIBILITY reference operator[](difference_type __n) const - {return *(*this + __n);} + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 + reverse_iterator() : __t(), current() {} + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 + explicit reverse_iterator(_Iter __x) : __t(__x), current(__x) {} + template + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 + reverse_iterator(const reverse_iterator<_Up>& __u) : __t(__u.base()), current(__u.base()) {} + template + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 + reverse_iterator& operator=(const reverse_iterator<_Up>& __u) + { __t = current = __u.base(); return *this; } + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 + _Iter base() const {return current;} + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 + reference operator*() const {_Iter __tmp = current; return *--__tmp;} + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 + pointer operator->() const {return _VSTD::addressof(operator*());} + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 + reverse_iterator& operator++() {--current; return *this;} + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 + reverse_iterator operator++(int) {reverse_iterator __tmp(*this); --current; return __tmp;} + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 + reverse_iterator& operator--() {++current; return *this;} + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 + reverse_iterator operator--(int) {reverse_iterator __tmp(*this); ++current; return __tmp;} + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 + reverse_iterator operator+ (difference_type __n) const {return reverse_iterator(current - __n);} + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 + reverse_iterator& operator+=(difference_type __n) {current -= __n; return *this;} + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 + reverse_iterator operator- (difference_type __n) const {return reverse_iterator(current + __n);} + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 + reverse_iterator& operator-=(difference_type __n) {current += __n; return *this;} + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 + reference operator[](difference_type __n) const {return *(*this + __n);} }; template -inline _LIBCPP_INLINE_VISIBILITY +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 bool operator==(const reverse_iterator<_Iter1>& __x, const reverse_iterator<_Iter2>& __y) { @@ -661,7 +676,7 @@ } template -inline _LIBCPP_INLINE_VISIBILITY +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 bool operator<(const reverse_iterator<_Iter1>& __x, const reverse_iterator<_Iter2>& __y) { @@ -669,7 +684,7 @@ } template -inline _LIBCPP_INLINE_VISIBILITY +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 bool operator!=(const reverse_iterator<_Iter1>& __x, const reverse_iterator<_Iter2>& __y) { @@ -677,7 +692,7 @@ } template -inline _LIBCPP_INLINE_VISIBILITY +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 bool operator>(const reverse_iterator<_Iter1>& __x, const reverse_iterator<_Iter2>& __y) { @@ -685,7 +700,7 @@ } template -inline _LIBCPP_INLINE_VISIBILITY +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 bool operator>=(const reverse_iterator<_Iter1>& __x, const reverse_iterator<_Iter2>& __y) { @@ -693,7 +708,7 @@ } template -inline _LIBCPP_INLINE_VISIBILITY +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 bool operator<=(const reverse_iterator<_Iter1>& __x, const reverse_iterator<_Iter2>& __y) { @@ -702,7 +717,7 @@ #ifndef _LIBCPP_CXX03_LANG template -inline _LIBCPP_INLINE_VISIBILITY +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 auto operator-(const reverse_iterator<_Iter1>& __x, const reverse_iterator<_Iter2>& __y) -> decltype(__y.base() - __x.base()) @@ -720,7 +735,7 @@ #endif template -inline _LIBCPP_INLINE_VISIBILITY +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 reverse_iterator<_Iter> operator+(typename reverse_iterator<_Iter>::difference_type __n, const reverse_iterator<_Iter>& __x) { @@ -729,7 +744,7 @@ #if _LIBCPP_STD_VER > 11 template -inline _LIBCPP_INLINE_VISIBILITY +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 reverse_iterator<_Iter> make_reverse_iterator(_Iter __i) { return reverse_iterator<_Iter>(__i); Index: test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.cons/default.pass.cpp =================================================================== --- test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.cons/default.pass.cpp +++ test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.cons/default.pass.cpp @@ -11,10 +11,13 @@ // reverse_iterator -// reverse_iterator(); +// constexpr reverse_iterator(); +// +// constexpr in c++17 #include +#include "test_macros.h" #include "test_iterators.h" template @@ -30,4 +33,10 @@ test >(); test(); test(); + +#if TEST_STD_VER > 14 + { + constexpr std::reverse_iterator it; + } +#endif } Index: test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.cons/iter.pass.cpp =================================================================== --- test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.cons/iter.pass.cpp +++ test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.cons/iter.pass.cpp @@ -11,11 +11,14 @@ // reverse_iterator -// explicit reverse_iterator(Iter x); +// explicit constexpr reverse_iterator(Iter x); +// +// constexpr in c++17 #include #include +#include "test_macros.h" #include "test_iterators.h" template @@ -32,4 +35,12 @@ test(bidirectional_iterator(s)); test(random_access_iterator(s)); test(s); + +#if TEST_STD_VER > 14 + { + constexpr const char *p = "123456789"; + constexpr std::reverse_iterator it(p); + static_assert(it.base() == p); + } +#endif } Index: test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.cons/reverse_iterator.pass.cpp =================================================================== --- test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.cons/reverse_iterator.pass.cpp +++ test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.cons/reverse_iterator.pass.cpp @@ -13,11 +13,14 @@ // template // requires HasConstructor -// reverse_iterator(const reverse_iterator &u); +// constexpr reverse_iterator(const reverse_iterator &u); +// +// constexpr in c++17 #include #include +#include "test_macros.h" #include "test_iterators.h" template @@ -39,4 +42,13 @@ test >(bidirectional_iterator(&d)); test >(random_access_iterator(&d)); test(&d); + +#if TEST_STD_VER > 14 + { + constexpr const Derived *p = nullptr; + constexpr std::reverse_iterator it1 = std::make_reverse_iterator(p); + constexpr std::reverse_iterator it2(it1); + static_assert(it2.base() == p); + } +#endif } Index: test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.make/make_reverse_iterator.pass.cpp =================================================================== --- test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.make/make_reverse_iterator.pass.cpp +++ test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.make/make_reverse_iterator.pass.cpp @@ -12,13 +12,17 @@ // reverse_iterator -// template reverse_iterator +// template +// constexpr reverse_iterator // make_reverse_iterator(Iterator i); +// +// constexpr in c++17 #include #include #include "test_iterators.h" +#include "test_macros.h" template void @@ -35,5 +39,13 @@ random_access_iteratore(s+10); while ( b != e ) test ( b++ ); + +#if TEST_STD_VER > 14 + { + constexpr const char *p = "123456789"; + constexpr auto it1 = std::make_reverse_iterator(p); + static_assert(it1.base() == p, ""); + } +#endif } Index: test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op!=/test.pass.cpp =================================================================== --- test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op!=/test.pass.cpp +++ test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op!=/test.pass.cpp @@ -13,12 +13,15 @@ // template // requires HasEqualTo -// bool +// constexpr bool // operator!=(const reverse_iterator& x, const reverse_iterator& y); +// +// constexpr in c++17 #include #include +#include "test_macros.h" #include "test_iterators.h" template @@ -39,4 +42,16 @@ test(random_access_iterator(s), random_access_iterator(s+1), true); test(s, s, false); test(s, s+1, true); + +#if TEST_STD_VER > 14 + { + constexpr const char *p = "123456789"; + typedef std::reverse_iterator RI; + constexpr RI it1 = std::make_reverse_iterator(p); + constexpr RI it2 = std::make_reverse_iterator(p); + constexpr RI it3 = std::make_reverse_iterator(p+1); + static_assert(!(it1 != it2), ""); + static_assert( (it1 != it3), ""); + } +#endif } Index: test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op++/post.pass.cpp =================================================================== --- test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op++/post.pass.cpp +++ test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op++/post.pass.cpp @@ -11,7 +11,9 @@ // reverse_iterator -// reverse_iterator operator++(int); +// constexpr reverse_iterator operator++(int); +// +// constexpr in c++17 #include #include @@ -34,4 +36,17 @@ test(bidirectional_iterator(s+1), bidirectional_iterator(s)); test(random_access_iterator(s+1), random_access_iterator(s)); test(s+1, s); + +#if TEST_STD_VER > 14 + { + constexpr const char *p = "123456789"; + typedef std::reverse_iterator RI; + constexpr RI it1 = std::make_reverse_iterator(p); + constexpr RI it2 = std::make_reverse_iterator(p+1); + static_assert(it1 != it2, ""); + constexpr RI it3 = std::make_reverse_iterator(p+1) ++; + static_assert(it1 != it3, ""); + static_assert(it2 == it3, ""); + } +#endif } Index: test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op++/pre.pass.cpp =================================================================== --- test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op++/pre.pass.cpp +++ test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op++/pre.pass.cpp @@ -11,11 +11,14 @@ // reverse_iterator -// reverse_iterator& operator++(); +// constexpr reverse_iterator& operator++(); +// +// constexpr in c++17 #include #include +#include "test_macros.h" #include "test_iterators.h" template @@ -34,4 +37,18 @@ test(bidirectional_iterator(s+1), bidirectional_iterator(s)); test(random_access_iterator(s+1), random_access_iterator(s)); test(s+1, s); + +#if TEST_STD_VER > 14 + { + constexpr const char *p = "123456789"; + typedef std::reverse_iterator RI; + constexpr RI it1 = std::make_reverse_iterator(p); + constexpr RI it2 = std::make_reverse_iterator(p+1); + static_assert(it1 != it2, ""); + constexpr RI it3 = ++ std::make_reverse_iterator(p+1); + static_assert(it1 == it3, ""); + static_assert(it2 != it3, ""); + static_assert(*(++std::make_reverse_iterator(p+2)) == '1', ""); + } +#endif } Index: test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op+/difference_type.pass.cpp =================================================================== --- test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op+/difference_type.pass.cpp +++ test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op+/difference_type.pass.cpp @@ -12,11 +12,14 @@ // reverse_iterator // requires RandomAccessIterator -// reverse_iterator operator+(difference_type n) const; +// constexpr reverse_iterator operator+(difference_type n) const; +// +// constexpr in c++17 #include #include +#include "test_macros.h" #include "test_iterators.h" template @@ -33,4 +36,17 @@ const char* s = "1234567890"; test(random_access_iterator(s+5), 5, random_access_iterator(s)); test(s+5, 5, s); + +#if TEST_STD_VER > 14 + { + constexpr const char *p = "123456789"; + typedef std::reverse_iterator RI; + constexpr RI it1 = std::make_reverse_iterator(p); + constexpr RI it2 = std::make_reverse_iterator(p + 5); + constexpr RI it3 = it2 + 5; + static_assert(it1 != it2, ""); + static_assert(it1 == it3, ""); + static_assert(it2 != it3, ""); + } +#endif } Index: test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op+=/difference_type.pass.cpp =================================================================== --- test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op+=/difference_type.pass.cpp +++ test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op+=/difference_type.pass.cpp @@ -12,11 +12,14 @@ // reverse_iterator // requires RandomAccessIterator -// reverse_iterator& operator+=(difference_type n); +// constexpr reverse_iterator& operator+=(difference_type n); +// +// constexpr in C++17 #include #include +#include "test_macros.h" #include "test_iterators.h" template @@ -34,4 +37,13 @@ const char* s = "1234567890"; test(random_access_iterator(s+5), 5, random_access_iterator(s)); test(s+5, 5, s); + +#if TEST_STD_VER > 14 + { + constexpr const char *p = "123456789"; + constexpr auto it1 = std::make_reverse_iterator(p); + constexpr auto it2 = std::make_reverse_iterator(p+5) += 5; + static_assert(it1 == it2, ""); + } +#endif } Index: test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op--/post.pass.cpp =================================================================== --- test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op--/post.pass.cpp +++ test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op--/post.pass.cpp @@ -11,11 +11,14 @@ // reverse_iterator -// reverse_iterator operator--(int); +// constexpr reverse_iterator operator--(int); +// +// constexpr in C++17 #include #include +#include "test_macros.h" #include "test_iterators.h" template @@ -34,4 +37,17 @@ test(bidirectional_iterator(s+1), bidirectional_iterator(s+2)); test(random_access_iterator(s+1), random_access_iterator(s+2)); test(s+1, s+2); + +#if TEST_STD_VER > 14 + { + constexpr const char *p = "123456789"; + typedef std::reverse_iterator RI; + constexpr RI it1 = std::make_reverse_iterator(p); + constexpr RI it2 = std::make_reverse_iterator(p+1); + static_assert(it1 != it2, ""); + constexpr RI it3 = std::make_reverse_iterator(p) --; + static_assert(it1 == it3, ""); + static_assert(it2 != it3, ""); + } +#endif } Index: test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op--/pre.pass.cpp =================================================================== --- test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op--/pre.pass.cpp +++ test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op--/pre.pass.cpp @@ -11,11 +11,14 @@ // reverse_iterator -// reverse_iterator& operator--(); +// constexpr reverse_iterator& operator--(); +// +// constexpr in C++17 #include #include +#include "test_macros.h" #include "test_iterators.h" template @@ -34,4 +37,18 @@ test(bidirectional_iterator(s+1), bidirectional_iterator(s+2)); test(random_access_iterator(s+1), random_access_iterator(s+2)); test(s+1, s+2); + +#if TEST_STD_VER > 14 + { + constexpr const char *p = "123456789"; + typedef std::reverse_iterator RI; + constexpr RI it1 = std::make_reverse_iterator(p); + constexpr RI it2 = std::make_reverse_iterator(p+1); + static_assert(it1 != it2, ""); + constexpr RI it3 = -- std::make_reverse_iterator(p); + static_assert(it1 != it3, ""); + static_assert(it2 == it3, ""); + static_assert(*(--std::make_reverse_iterator(p)) == '1', ""); + } +#endif } Index: test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op-/difference_type.pass.cpp =================================================================== --- test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op-/difference_type.pass.cpp +++ test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op-/difference_type.pass.cpp @@ -12,11 +12,14 @@ // reverse_iterator // requires RandomAccessIterator -// reverse_iterator operator-(difference_type n) const; +// constexpr reverse_iterator operator-(difference_type n) const; +// +// constexpr in c++17 #include #include +#include "test_macros.h" #include "test_iterators.h" template @@ -33,4 +36,17 @@ const char* s = "1234567890"; test(random_access_iterator(s+5), 5, random_access_iterator(s+10)); test(s+5, 5, s+10); + +#if TEST_STD_VER > 14 + { + constexpr const char *p = "123456789"; + typedef std::reverse_iterator RI; + constexpr RI it1 = std::make_reverse_iterator(p); + constexpr RI it2 = std::make_reverse_iterator(p + 5); + constexpr RI it3 = it1 - 5; + static_assert(it1 != it2, ""); + static_assert(it1 != it3, ""); + static_assert(it2 == it3, ""); + } +#endif } Index: test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op-=/difference_type.pass.cpp =================================================================== --- test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op-=/difference_type.pass.cpp +++ test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op-=/difference_type.pass.cpp @@ -12,11 +12,14 @@ // reverse_iterator // requires RandomAccessIterator -// reverse_iterator& operator-=(difference_type n); +// constexpr reverse_iterator& operator-=(difference_type n); +// +// constexpr in C++17 #include #include +#include "test_macros.h" #include "test_iterators.h" template @@ -34,4 +37,13 @@ const char* s = "1234567890"; test(random_access_iterator(s+5), 5, random_access_iterator(s+10)); test(s+5, 5, s+10); + +#if TEST_STD_VER > 14 + { + constexpr const char *p = "123456789"; + constexpr auto it1 = std::make_reverse_iterator(p+5); + constexpr auto it2 = std::make_reverse_iterator(p) -= 5; + static_assert(it1 == it2, ""); + } +#endif } Index: test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op.star/op_star.pass.cpp =================================================================== --- test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op.star/op_star.pass.cpp +++ test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op.star/op_star.pass.cpp @@ -11,7 +11,9 @@ // reverse_iterator -// reference operator*() const; +// constexpr reference operator*() const; +// +// constexpr in c++17 // Be sure to respect LWG 198: // http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#198 @@ -21,6 +23,8 @@ #include #include +#include "test_macros.h" + class A { int data_; @@ -44,4 +48,15 @@ { A a; test(&a+1, A()); + +#if TEST_STD_VER > 14 + { + constexpr const char *p = "123456789"; + typedef std::reverse_iterator RI; + constexpr RI it1 = std::make_reverse_iterator(p+1); + constexpr RI it2 = std::make_reverse_iterator(p+2); + static_assert(*it1 == p[0], ""); + static_assert(*it2 == p[1], ""); + } +#endif } Index: test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op=/reverse_iterator.pass.cpp =================================================================== --- test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op=/reverse_iterator.pass.cpp +++ test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op=/reverse_iterator.pass.cpp @@ -13,12 +13,15 @@ // template // requires HasAssign -// reverse_iterator& +// constexpr reverse_iterator& // operator=(const reverse_iterator& u); +// +// constexpr in c++17 #include #include +#include "test_macros.h" #include "test_iterators.h" template @@ -42,4 +45,13 @@ test >(bidirectional_iterator(&d)); test >(random_access_iterator(&d)); test(&d); + +#if TEST_STD_VER > 14 + { + constexpr const Derived *p = nullptr; + constexpr std::reverse_iterator it1 = std::make_reverse_iterator(p); + constexpr std::reverse_iterator it2 = (std::make_reverse_iterator(p) = it1); + static_assert(it2.base() == p); + } +#endif } Index: test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op==/test.pass.cpp =================================================================== --- test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op==/test.pass.cpp +++ test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op==/test.pass.cpp @@ -13,12 +13,15 @@ // template // requires HasEqualTo -// bool +// constexpr bool // operator==(const reverse_iterator& x, const reverse_iterator& y); +// +// constexpr in c++17 #include #include +#include "test_macros.h" #include "test_iterators.h" template @@ -39,4 +42,17 @@ test(random_access_iterator(s), random_access_iterator(s+1), false); test(s, s, true); test(s, s+1, false); + +#if TEST_STD_VER > 14 + { + constexpr const char *p = "123456789"; + typedef std::reverse_iterator RI; + constexpr RI it1 = std::make_reverse_iterator(p); + constexpr RI it2 = std::make_reverse_iterator(p); + constexpr RI it3 = std::make_reverse_iterator(p+1); + static_assert( (it1 == it2), ""); + static_assert(!(it1 == it3), ""); + } +#endif + } Index: test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.opdiff/test.pass.cpp =================================================================== --- test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.opdiff/test.pass.cpp +++ test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.opdiff/test.pass.cpp @@ -13,13 +13,16 @@ // template // requires HasMinus -// auto operator-(const reverse_iterator& x, const reverse_iterator& y) +// constexpr auto operator-(const reverse_iterator& x, const reverse_iterator& y) // -> decltype(y.base() - x.base()); +// +// constexpr in c++17 #include #include #include +#include "test_macros.h" #include "test_iterators.h" template @@ -40,4 +43,15 @@ test(s, s, 0); test(s, s+1, 1); test(s+1, s, -1); + +#if TEST_STD_VER > 14 + { + constexpr const char *p = "123456789"; + typedef std::reverse_iterator RI; + constexpr RI it1 = std::make_reverse_iterator(p); + constexpr RI it2 = std::make_reverse_iterator(p+1); + static_assert( it1 - it2 == 1, ""); + static_assert( it2 - it1 == -1, ""); + } +#endif } Index: test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.opgt/test.pass.cpp =================================================================== --- test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.opgt/test.pass.cpp +++ test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.opgt/test.pass.cpp @@ -13,12 +13,15 @@ // template // requires HasGreater -// bool +// constexpr bool // operator>(const reverse_iterator& x, const reverse_iterator& y); +// +// constexpr in c++17 #include #include +#include "test_macros.h" #include "test_iterators.h" template @@ -39,4 +42,16 @@ test(s, s, false); test(s, s+1, true); test(s+1, s, false); + +#if TEST_STD_VER > 14 + { + constexpr const char *p = "123456789"; + typedef std::reverse_iterator RI; + constexpr RI it1 = std::make_reverse_iterator(p); + constexpr RI it2 = std::make_reverse_iterator(p); + constexpr RI it3 = std::make_reverse_iterator(p+1); + static_assert(!(it1 > it2), ""); + static_assert( (it1 > it3), ""); + } +#endif } Index: test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.opgt=/test.pass.cpp =================================================================== --- test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.opgt=/test.pass.cpp +++ test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.opgt=/test.pass.cpp @@ -13,12 +13,15 @@ // template // requires HasGreater -// bool +// constexpr bool // operator>=(const reverse_iterator& x, const reverse_iterator& y); +// +// constexpr in c++17 #include #include +#include "test_macros.h" #include "test_iterators.h" template @@ -39,4 +42,16 @@ test(s, s, true); test(s, s+1, true); test(s+1, s, false); + +#if TEST_STD_VER > 14 + { + constexpr const char *p = "123456789"; + typedef std::reverse_iterator RI; + constexpr RI it1 = std::make_reverse_iterator(p); + constexpr RI it2 = std::make_reverse_iterator(p); + constexpr RI it3 = std::make_reverse_iterator(p+1); + static_assert( (it1 >= it2), ""); + static_assert( (it1 >= it3), ""); + } +#endif } Index: test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.oplt/test.pass.cpp =================================================================== --- test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.oplt/test.pass.cpp +++ test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.oplt/test.pass.cpp @@ -13,12 +13,15 @@ // template // requires HasGreater -// bool +// constexpr bool // operator<(const reverse_iterator& x, const reverse_iterator& y); +// +// constexpr in c++17 #include #include +#include "test_macros.h" #include "test_iterators.h" template @@ -39,4 +42,16 @@ test(s, s, false); test(s, s+1, false); test(s+1, s, true); + +#if TEST_STD_VER > 14 + { + constexpr const char *p = "123456789"; + typedef std::reverse_iterator RI; + constexpr RI it1 = std::make_reverse_iterator(p); + constexpr RI it2 = std::make_reverse_iterator(p); + constexpr RI it3 = std::make_reverse_iterator(p+1); + static_assert(!(it1 < it2), ""); + static_assert(!(it1 < it3), ""); + } +#endif } Index: test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.oplt=/test.pass.cpp =================================================================== --- test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.oplt=/test.pass.cpp +++ test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.oplt=/test.pass.cpp @@ -13,12 +13,15 @@ // template // requires HasGreater -// bool +// constexpr bool // operator<=(const reverse_iterator& x, const reverse_iterator& y); +// +// constexpr in c++17 #include #include +#include "test_macros.h" #include "test_iterators.h" template @@ -39,4 +42,16 @@ test(s, s, true); test(s, s+1, false); test(s+1, s, true); + +#if TEST_STD_VER > 14 + { + constexpr const char *p = "123456789"; + typedef std::reverse_iterator RI; + constexpr RI it1 = std::make_reverse_iterator(p); + constexpr RI it2 = std::make_reverse_iterator(p); + constexpr RI it3 = std::make_reverse_iterator(p+1); + static_assert( (it1 <= it2), ""); + static_assert(!(it1 <= it3), ""); + } +#endif } Index: test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.opref/op_arrow.pass.cpp =================================================================== --- test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.opref/op_arrow.pass.cpp +++ test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.opref/op_arrow.pass.cpp @@ -11,7 +11,9 @@ // reverse_iterator -// pointer operator->() const; +// constexpr pointer operator->() const; +// +// constexpr in C++17 // Be sure to respect LWG 198: // http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#198 @@ -23,6 +25,8 @@ #include #include +#include "test_macros.h" + class A { int data_; @@ -59,6 +63,20 @@ B *operator&() { return nullptr; } }; +class C +{ + int data_; +public: + TEST_CONSTEXPR C() : data_(1) {} + + TEST_CONSTEXPR int get() const {return data_;} + + friend TEST_CONSTEXPR bool operator==(const C& x, const C& y) + {return x.data_ == y.data_;} +}; + +TEST_CONSTEXPR C gC; + int main() { A a; @@ -86,4 +104,13 @@ assert ( ri == l.rend ()); } } + +#if TEST_STD_VER > 14 + { + typedef std::reverse_iterator RI; + constexpr RI it1 = std::make_reverse_iterator(&gC+1); + + static_assert(it1->get() == gC.get(), ""); + } +#endif } Index: test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.opsum/difference_type.pass.cpp =================================================================== --- test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.opsum/difference_type.pass.cpp +++ test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.opsum/difference_type.pass.cpp @@ -12,12 +12,15 @@ // reverse_iterator // template -// reverse_iterator +// constexpr reverse_iterator // operator+(Iter::difference_type n, const reverse_iterator& x); +// +// constexpr in C++17 #include #include +#include "test_macros.h" #include "test_iterators.h" template @@ -34,4 +37,17 @@ const char* s = "1234567890"; test(random_access_iterator(s+5), 5, random_access_iterator(s)); test(s+5, 5, s); + +#if TEST_STD_VER > 14 + { + constexpr const char *p = "123456789"; + typedef std::reverse_iterator RI; + constexpr RI it1 = std::make_reverse_iterator(p); + constexpr RI it2 = std::make_reverse_iterator(p + 5); + constexpr RI it3 = 5 + it2; + static_assert(it1 != it2, ""); + static_assert(it1 == it3, ""); + static_assert(it2 != it3, ""); + } +#endif }