Index: include/iterator =================================================================== --- include/iterator +++ include/iterator @@ -219,61 +219,64 @@ typedef typename iterator_traits::iterator_category iterator_category; typedef value_type&& reference; - move_iterator(); - explicit move_iterator(Iterator i); - template move_iterator(const move_iterator& u); - template move_iterator& operator=(const move_iterator& u); - iterator_type base() const; - reference operator*() const; - pointer operator->() const; - move_iterator& operator++(); - move_iterator operator++(int); - move_iterator& operator--(); - move_iterator operator--(int); - move_iterator operator+(difference_type n) const; - move_iterator& operator+=(difference_type n); - move_iterator operator-(difference_type n) const; - move_iterator& operator-=(difference_type n); - unspecified operator[](difference_type n) const; + constexpr move_iterator(); // all the constexprs are in C++17 + constexpr explicit move_iterator(Iterator i); + template + constexpr move_iterator(const move_iterator& u); + template + constexpr move_iterator& operator=(const move_iterator& u); + constexpr iterator_type base() const; + constexpr reference operator*() const; + constexpr pointer operator->() const; + constexpr move_iterator& operator++(); + constexpr move_iterator operator++(int); + constexpr move_iterator& operator--(); + constexpr move_iterator operator--(int); + constexpr move_iterator operator+(difference_type n) const; + constexpr move_iterator& operator+=(difference_type n); + constexpr move_iterator operator-(difference_type n) const; + constexpr move_iterator& operator-=(difference_type n); + constexpr unspecified operator[](difference_type n) const; private: Iterator current; // exposition only }; template -bool +constexpr bool // constexpr in C++17 operator==(const move_iterator& x, const move_iterator& y); template -bool +constexpr bool // constexpr in C++17 operator!=(const move_iterator& x, const move_iterator& y); template -bool +constexpr bool // constexpr in C++17 operator<(const move_iterator& x, const move_iterator& y); template -bool +constexpr bool // constexpr in C++17 operator<=(const move_iterator& x, const move_iterator& y); template -bool +constexpr bool // constexpr in C++17 operator>(const move_iterator& x, const move_iterator& y); template -bool +constexpr bool // constexpr in C++17 operator>=(const move_iterator& x, const move_iterator& y); template -auto +constexpr auto // constexpr in C++17 operator-(const move_iterator& x, const move_iterator& y) -> decltype(x.base() - y.base()); template -move_iterator operator+(typename move_iterator::difference_type n, - const move_iterator& x); +constexpr move_iterator operator+( // constexpr in C++17 + typename move_iterator::difference_type n, + const move_iterator& x); -template -move_iterator make_move_iterator(const Iterator& i); +template // constexpr in C++17 +constexpr move_iterator make_move_iterator(const Iterator& i); template , class Distance = ptrdiff_t> @@ -511,8 +514,8 @@ template struct __is_exactly_input_iterator : public integral_constant::value && - !__has_iterator_category_convertible_to<_Tp, forward_iterator_tag>::value> {}; + __has_iterator_category_convertible_to<_Tp, input_iterator_tag>::value && + !__has_iterator_category_convertible_to<_Tp, forward_iterator_tag>::value> {}; template @@ -1055,37 +1058,40 @@ typedef typename iterator_traits::reference reference; #endif - _LIBCPP_INLINE_VISIBILITY move_iterator() : __i() {} - _LIBCPP_INLINE_VISIBILITY explicit move_iterator(_Iter __x) : __i(__x) {} - template _LIBCPP_INLINE_VISIBILITY move_iterator(const move_iterator<_Up>& __u) - : __i(__u.base()) {} - _LIBCPP_INLINE_VISIBILITY _Iter base() const {return __i;} - _LIBCPP_INLINE_VISIBILITY reference operator*() const { - return static_cast(*__i); - } - _LIBCPP_INLINE_VISIBILITY pointer operator->() const { return __i;} - _LIBCPP_INLINE_VISIBILITY move_iterator& operator++() {++__i; return *this;} - _LIBCPP_INLINE_VISIBILITY move_iterator operator++(int) - {move_iterator __tmp(*this); ++__i; return __tmp;} - _LIBCPP_INLINE_VISIBILITY move_iterator& operator--() {--__i; return *this;} - _LIBCPP_INLINE_VISIBILITY move_iterator operator--(int) - {move_iterator __tmp(*this); --__i; return __tmp;} - _LIBCPP_INLINE_VISIBILITY move_iterator operator+ (difference_type __n) const - {return move_iterator(__i + __n);} - _LIBCPP_INLINE_VISIBILITY move_iterator& operator+=(difference_type __n) - {__i += __n; return *this;} - _LIBCPP_INLINE_VISIBILITY move_iterator operator- (difference_type __n) const - {return move_iterator(__i - __n);} - _LIBCPP_INLINE_VISIBILITY move_iterator& operator-=(difference_type __n) - {__i -= __n; return *this;} - _LIBCPP_INLINE_VISIBILITY reference operator[](difference_type __n) const - { - return static_cast(__i[__n]); - } + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 + move_iterator() : __i() {} + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 + explicit move_iterator(_Iter __x) : __i(__x) {} + template + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 + move_iterator(const move_iterator<_Up>& __u) : __i(__u.base()) {} + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 _Iter base() const {return __i;} + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 + reference operator*() const { return static_cast(*__i); } + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 + pointer operator->() const { return __i;} + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 + move_iterator& operator++() {++__i; return *this;} + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 + move_iterator operator++(int) {move_iterator __tmp(*this); ++__i; return __tmp;} + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 + move_iterator& operator--() {--__i; return *this;} + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 + move_iterator operator--(int) {move_iterator __tmp(*this); --__i; return __tmp;} + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 + move_iterator operator+ (difference_type __n) const {return move_iterator(__i + __n);} + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 + move_iterator& operator+=(difference_type __n) {__i += __n; return *this;} + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 + move_iterator operator- (difference_type __n) const {return move_iterator(__i - __n);} + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 + move_iterator& operator-=(difference_type __n) {__i -= __n; return *this;} + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 + reference operator[](difference_type __n) const { return static_cast(__i[__n]); } }; template -inline _LIBCPP_INLINE_VISIBILITY +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 bool operator==(const move_iterator<_Iter1>& __x, const move_iterator<_Iter2>& __y) { @@ -1093,7 +1099,7 @@ } template -inline _LIBCPP_INLINE_VISIBILITY +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 bool operator<(const move_iterator<_Iter1>& __x, const move_iterator<_Iter2>& __y) { @@ -1101,7 +1107,7 @@ } template -inline _LIBCPP_INLINE_VISIBILITY +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 bool operator!=(const move_iterator<_Iter1>& __x, const move_iterator<_Iter2>& __y) { @@ -1109,7 +1115,7 @@ } template -inline _LIBCPP_INLINE_VISIBILITY +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 bool operator>(const move_iterator<_Iter1>& __x, const move_iterator<_Iter2>& __y) { @@ -1117,7 +1123,7 @@ } template -inline _LIBCPP_INLINE_VISIBILITY +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 bool operator>=(const move_iterator<_Iter1>& __x, const move_iterator<_Iter2>& __y) { @@ -1125,7 +1131,7 @@ } template -inline _LIBCPP_INLINE_VISIBILITY +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 bool operator<=(const move_iterator<_Iter1>& __x, const move_iterator<_Iter2>& __y) { @@ -1134,7 +1140,7 @@ #ifndef _LIBCPP_CXX03_LANG template -inline _LIBCPP_INLINE_VISIBILITY +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 auto operator-(const move_iterator<_Iter1>& __x, const move_iterator<_Iter2>& __y) -> decltype(__x.base() - __y.base()) @@ -1152,7 +1158,7 @@ #endif template -inline _LIBCPP_INLINE_VISIBILITY +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 move_iterator<_Iter> operator+(typename move_iterator<_Iter>::difference_type __n, const move_iterator<_Iter>& __x) { @@ -1160,7 +1166,7 @@ } template -inline _LIBCPP_INLINE_VISIBILITY +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 move_iterator<_Iter> make_move_iterator(_Iter __i) { @@ -1550,19 +1556,19 @@ template struct __libcpp_is_trivial_iterator - : public _LIBCPP_BOOL_CONSTANT(is_pointer<_Iter>::value) {}; - + : public _LIBCPP_BOOL_CONSTANT(is_pointer<_Iter>::value) {}; + template struct __libcpp_is_trivial_iterator > - : public _LIBCPP_BOOL_CONSTANT(__libcpp_is_trivial_iterator<_Iter>::value) {}; + : public _LIBCPP_BOOL_CONSTANT(__libcpp_is_trivial_iterator<_Iter>::value) {}; template struct __libcpp_is_trivial_iterator > - : public _LIBCPP_BOOL_CONSTANT(__libcpp_is_trivial_iterator<_Iter>::value) {}; + : public _LIBCPP_BOOL_CONSTANT(__libcpp_is_trivial_iterator<_Iter>::value) {}; template struct __libcpp_is_trivial_iterator<__wrap_iter<_Iter> > - : public _LIBCPP_BOOL_CONSTANT(__libcpp_is_trivial_iterator<_Iter>::value) {}; + : public _LIBCPP_BOOL_CONSTANT(__libcpp_is_trivial_iterator<_Iter>::value) {}; template Index: test/std/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.nonmember/make_move_iterator.pass.cpp =================================================================== --- test/std/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.nonmember/make_move_iterator.pass.cpp +++ test/std/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.nonmember/make_move_iterator.pass.cpp @@ -14,10 +14,13 @@ // template // move_iterator // make_move_iterator(const Iter& i); +// +// constexpr in C++17 #include #include +#include "test_macros.h" #include "test_iterators.h" template @@ -43,4 +46,12 @@ std::make_move_iterator(a+4); std::make_move_iterator(a); // test for LWG issue 2061 } + +#if TEST_STD_VER > 14 + { + constexpr const char *p = "123456789"; + constexpr auto iter = std::make_move_iterator(p); + static_assert(iter.base() == p); + } +#endif } Index: test/std/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.nonmember/minus.pass.cpp =================================================================== --- test/std/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.nonmember/minus.pass.cpp +++ test/std/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.nonmember/minus.pass.cpp @@ -16,10 +16,13 @@ // auto // operator-(const move_iterator& x, const move_iterator& y) // -> decltype(x.base() - y.base()); +// +// constexpr in C++17 #include #include +#include "test_macros.h" #include "test_iterators.h" template @@ -36,4 +39,15 @@ char s[] = "1234567890"; test(random_access_iterator(s+5), random_access_iterator(s), 5); test(s+5, s, 5); + +#if TEST_STD_VER > 14 + { + constexpr const char *p = "123456789"; + typedef std::move_iterator MI; + constexpr MI it1 = std::make_move_iterator(p); + constexpr MI it2 = std::make_move_iterator(p+1); + static_assert( it1 - it2 == -1, ""); + static_assert( it2 - it1 == 1, ""); + } +#endif } Index: test/std/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.nonmember/plus.pass.cpp =================================================================== --- test/std/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.nonmember/plus.pass.cpp +++ test/std/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.nonmember/plus.pass.cpp @@ -14,10 +14,13 @@ // template // move_iterator // operator+(Iter::difference_type n, const move_iterator& x); +// +// constexpr in C++17 #include #include +#include "test_macros.h" #include "test_iterators.h" template @@ -34,4 +37,17 @@ 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::move_iterator MI; + constexpr MI it1 = std::make_move_iterator(p); + constexpr MI it2 = std::make_move_iterator(p + 5); + constexpr MI it3 = it1 + 5; + static_assert(it1 != it2, ""); + static_assert(it1 != it3, ""); + static_assert(it2 == it3, ""); + } +#endif } Index: test/std/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.+/difference_type.pass.cpp =================================================================== --- test/std/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.+/difference_type.pass.cpp +++ test/std/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.+/difference_type.pass.cpp @@ -13,10 +13,13 @@ // requires RandomAccessIterator // move_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::move_iterator MI; + constexpr MI it1 = std::make_move_iterator(p); + constexpr MI it2 = std::make_move_iterator(p + 5); + constexpr MI it3 = it1 + 5; + static_assert(it1 != it2, ""); + static_assert(it1 != it3, ""); + static_assert(it2 == it3, ""); + } +#endif } Index: test/std/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.+=/difference_type.pass.cpp =================================================================== --- test/std/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.+=/difference_type.pass.cpp +++ test/std/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.+=/difference_type.pass.cpp @@ -13,10 +13,13 @@ // requires RandomAccessIterator // move_iterator& operator+=(difference_type n); +// +// 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+10)); test(s+5, 5, s+10); + +#if TEST_STD_VER > 14 + { + constexpr const char *p = "123456789"; + typedef std::move_iterator MI; + constexpr MI it1 = std::make_move_iterator(p); + constexpr MI it2 = std::make_move_iterator(p + 5); + constexpr MI it3 = std::make_move_iterator(p) += 5; + static_assert(it1 != it2, ""); + static_assert(it1 != it3, ""); + static_assert(it2 == it3, ""); + } +#endif } Index: test/std/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.-/difference_type.pass.cpp =================================================================== --- test/std/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.-/difference_type.pass.cpp +++ test/std/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.-/difference_type.pass.cpp @@ -13,10 +13,13 @@ // requires RandomAccessIterator // move_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::move_iterator MI; + constexpr MI it1 = std::make_move_iterator(p); + constexpr MI it2 = std::make_move_iterator(p + 5); + constexpr MI it3 = it2 - 5; + static_assert(it1 != it2, ""); + static_assert(it1 == it3, ""); + static_assert(it2 != it3, ""); + } +#endif } Index: test/std/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.-=/difference_type.pass.cpp =================================================================== --- test/std/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.-=/difference_type.pass.cpp +++ test/std/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.-=/difference_type.pass.cpp @@ -13,10 +13,13 @@ // requires RandomAccessIterator // move_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_move_iterator(p); + constexpr auto it2 = std::make_move_iterator(p+5) -= 5; + static_assert(it1 == it2, ""); + } +#endif } Index: test/std/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.comp/op_eq.pass.cpp =================================================================== --- test/std/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.comp/op_eq.pass.cpp +++ test/std/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.comp/op_eq.pass.cpp @@ -15,10 +15,13 @@ // requires HasEqualTo // bool // operator==(const move_iterator& x, const move_iterator& y); +// +// constexpr in C++17 #include #include +#include "test_macros.h" #include "test_iterators.h" template @@ -43,4 +46,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::move_iterator MI; + constexpr MI it1 = std::make_move_iterator(p); + constexpr MI it2 = std::make_move_iterator(p + 5); + constexpr MI it3 = std::make_move_iterator(p); + static_assert(!(it1 == it2), ""); + static_assert( (it1 == it3), ""); + static_assert(!(it2 == it3), ""); + } +#endif } Index: test/std/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.comp/op_gt.pass.cpp =================================================================== --- test/std/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.comp/op_gt.pass.cpp +++ test/std/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.comp/op_gt.pass.cpp @@ -15,10 +15,13 @@ // requires HasLess // bool // operator>(const move_iterator& x, const move_iterator& y); +// +// constexpr in C++17 #include #include +#include "test_macros.h" #include "test_iterators.h" template @@ -39,4 +42,17 @@ 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::move_iterator MI; + constexpr MI it1 = std::make_move_iterator(p); + constexpr MI it2 = std::make_move_iterator(p + 5); + constexpr MI it3 = std::make_move_iterator(p); + static_assert(!(it1 > it2), ""); + static_assert(!(it1 > it3), ""); + static_assert( (it2 > it3), ""); + } +#endif } Index: test/std/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.comp/op_gte.pass.cpp =================================================================== --- test/std/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.comp/op_gte.pass.cpp +++ test/std/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.comp/op_gte.pass.cpp @@ -15,10 +15,13 @@ // requires HasLess // bool // operator>=(const move_iterator& x, const move_iterator& y); +// +// constexpr in C++17 #include #include +#include "test_macros.h" #include "test_iterators.h" template @@ -39,4 +42,17 @@ 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::move_iterator MI; + constexpr MI it1 = std::make_move_iterator(p); + constexpr MI it2 = std::make_move_iterator(p + 5); + constexpr MI it3 = std::make_move_iterator(p); + static_assert(!(it1 >= it2), ""); + static_assert( (it1 >= it3), ""); + static_assert( (it2 >= it3), ""); + } +#endif } Index: test/std/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.comp/op_lt.pass.cpp =================================================================== --- test/std/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.comp/op_lt.pass.cpp +++ test/std/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.comp/op_lt.pass.cpp @@ -15,10 +15,13 @@ // requires HasLess // bool // operator<(const move_iterator& x, const move_iterator& y); +// +// constexpr in C++17 #include #include +#include "test_macros.h" #include "test_iterators.h" template @@ -39,4 +42,17 @@ 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::move_iterator MI; + constexpr MI it1 = std::make_move_iterator(p); + constexpr MI it2 = std::make_move_iterator(p + 5); + constexpr MI it3 = std::make_move_iterator(p); + static_assert( (it1 < it2), ""); + static_assert(!(it1 < it3), ""); + static_assert(!(it2 < it3), ""); + } +#endif } Index: test/std/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.comp/op_lte.pass.cpp =================================================================== --- test/std/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.comp/op_lte.pass.cpp +++ test/std/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.comp/op_lte.pass.cpp @@ -15,10 +15,13 @@ // requires HasLess // bool // operator<=(const move_iterator& x, const move_iterator& y); +// +// constexpr in C++17 #include #include +#include "test_macros.h" #include "test_iterators.h" template @@ -39,4 +42,17 @@ 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::move_iterator MI; + constexpr MI it1 = std::make_move_iterator(p); + constexpr MI it2 = std::make_move_iterator(p + 5); + constexpr MI it3 = std::make_move_iterator(p); + static_assert( (it1 <= it2), ""); + static_assert( (it1 <= it3), ""); + static_assert(!(it2 <= it3), ""); + } +#endif } Index: test/std/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.comp/op_neq.pass.cpp =================================================================== --- test/std/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.comp/op_neq.pass.cpp +++ test/std/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.comp/op_neq.pass.cpp @@ -15,10 +15,13 @@ // requires HasEqualTo // bool // operator!=(const move_iterator& x, const move_iterator& y); +// +// constexpr in C++17 #include #include +#include "test_macros.h" #include "test_iterators.h" template @@ -43,4 +46,17 @@ 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::move_iterator MI; + constexpr MI it1 = std::make_move_iterator(p); + constexpr MI it2 = std::make_move_iterator(p + 5); + constexpr MI it3 = std::make_move_iterator(p); + static_assert( (it1 != it2), ""); + static_assert(!(it1 != it3), ""); + static_assert( (it2 != it3), ""); + } +#endif } Index: test/std/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.const/convert.pass.cpp =================================================================== --- test/std/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.const/convert.pass.cpp +++ test/std/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.const/convert.pass.cpp @@ -14,10 +14,13 @@ // template // requires HasConstructor // move_iterator(const move_iterator &u); +// +// constexpr in C++17 #include #include +#include "test_macros.h" #include "test_iterators.h" template @@ -41,4 +44,13 @@ test >(bidirectional_iterator(&d)); test >(random_access_iterator(&d)); test(&d); + +#if TEST_STD_VER > 14 + { + constexpr const Derived *p = nullptr; + constexpr std::move_iterator it1 = std::make_move_iterator(p); + constexpr std::move_iterator it2(it1); + static_assert(it2.base() == p); + } +#endif } Index: test/std/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.const/default.pass.cpp =================================================================== --- test/std/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.const/default.pass.cpp +++ test/std/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.const/default.pass.cpp @@ -12,9 +12,12 @@ // move_iterator // move_iterator(); +// +// constexpr in C++17 #include +#include "test_macros.h" #include "test_iterators.h" template @@ -31,4 +34,10 @@ test >(); test >(); test(); + +#if TEST_STD_VER > 14 + { + constexpr std::move_iterator it; + } +#endif } Index: test/std/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.const/iter.pass.cpp =================================================================== --- test/std/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.const/iter.pass.cpp +++ test/std/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.const/iter.pass.cpp @@ -12,10 +12,13 @@ // move_iterator // explicit move_iterator(Iter i); +// +// constexpr in C++17 #include #include +#include "test_macros.h" #include "test_iterators.h" template @@ -34,4 +37,12 @@ test(bidirectional_iterator(s)); test(random_access_iterator(s)); test(s); + +#if TEST_STD_VER > 14 + { + constexpr const char *p = "123456789"; + constexpr std::move_iterator it(p); + static_assert(it.base() == p); + } +#endif } Index: test/std/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.decr/post.pass.cpp =================================================================== --- test/std/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.decr/post.pass.cpp +++ test/std/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.decr/post.pass.cpp @@ -12,10 +12,13 @@ // move_iterator // move_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)); 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::move_iterator MI; + constexpr MI it1 = std::make_move_iterator(p); + constexpr MI it2 = std::make_move_iterator(p+1); + static_assert(it1 != it2, ""); + constexpr MI it3 = std::make_move_iterator(p+1) --; + static_assert(it1 != it3, ""); + static_assert(it2 == it3, ""); + } +#endif } Index: test/std/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.decr/pre.pass.cpp =================================================================== --- test/std/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.decr/pre.pass.cpp +++ test/std/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.decr/pre.pass.cpp @@ -12,10 +12,13 @@ // move_iterator // move_iterator& operator--(); +// +// 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)); 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::move_iterator MI; + constexpr MI it1 = std::make_move_iterator(p); + constexpr MI it2 = std::make_move_iterator(p+1); + static_assert(it1 != it2, ""); + constexpr MI it3 = -- std::make_move_iterator(p+1); + static_assert(it1 == it3, ""); + static_assert(it2 != it3, ""); + } +#endif } Index: test/std/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.incr/post.pass.cpp =================================================================== --- test/std/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.incr/post.pass.cpp +++ test/std/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.incr/post.pass.cpp @@ -12,10 +12,13 @@ // move_iterator // move_iterator operator++(int); +// +// constexpr in C++17 #include #include +#include "test_macros.h" #include "test_iterators.h" template @@ -36,4 +39,17 @@ test(bidirectional_iterator(s), bidirectional_iterator(s+1)); test(random_access_iterator(s), random_access_iterator(s+1)); test(s, s+1); + +#if TEST_STD_VER > 14 + { + constexpr const char *p = "123456789"; + typedef std::move_iterator MI; + constexpr MI it1 = std::make_move_iterator(p); + constexpr MI it2 = std::make_move_iterator(p+1); + static_assert(it1 != it2, ""); + constexpr MI it3 = std::make_move_iterator(p) ++; + static_assert(it1 == it3, ""); + static_assert(it2 != it3, ""); + } +#endif } Index: test/std/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.incr/pre.pass.cpp =================================================================== --- test/std/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.incr/pre.pass.cpp +++ test/std/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.incr/pre.pass.cpp @@ -12,10 +12,13 @@ // move_iterator // move_iterator& operator++(); +// +// constexpr in C++17 #include #include +#include "test_macros.h" #include "test_iterators.h" template @@ -36,4 +39,17 @@ test(bidirectional_iterator(s), bidirectional_iterator(s+1)); test(random_access_iterator(s), random_access_iterator(s+1)); test(s, s+1); + +#if TEST_STD_VER > 14 + { + constexpr const char *p = "123456789"; + typedef std::move_iterator MI; + constexpr MI it1 = std::make_move_iterator(p); + constexpr MI it2 = std::make_move_iterator(p+1); + static_assert(it1 != it2, ""); + constexpr MI it3 = ++ std::make_move_iterator(p); + static_assert(it1 != it3, ""); + static_assert(it2 == it3, ""); + } +#endif } Index: test/std/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.index/difference_type.pass.cpp =================================================================== --- test/std/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.index/difference_type.pass.cpp +++ test/std/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.index/difference_type.pass.cpp @@ -13,6 +13,8 @@ // requires RandomAccessIterator // unspecified operator[](difference_type n) const; +// +// constexpr in C++17 #include #include @@ -20,6 +22,7 @@ #include #endif +#include "test_macros.h" #include "test_iterators.h" template @@ -55,4 +58,14 @@ p[j].reset(i+j); test(p, 3, Ptr(i+3)); #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +#if TEST_STD_VER > 14 + { + constexpr const char *p = "123456789"; + typedef std::move_iterator MI; + constexpr MI it1 = std::make_move_iterator(p); + static_assert(it1[0] == '1', ""); + static_assert(it1[5] == '6', ""); + } +#endif } Index: test/std/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.ref/op_arrow.pass.cpp =================================================================== --- test/std/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.ref/op_arrow.pass.cpp +++ test/std/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.ref/op_arrow.pass.cpp @@ -12,10 +12,14 @@ // move_iterator // pointer operator->() const; +// +// constexpr in C++17 #include #include +#include "test_macros.h" + template void test(It i) @@ -28,4 +32,15 @@ { char s[] = "123"; test(s); + +#if TEST_STD_VER > 14 + { + constexpr const char *p = "123456789"; + typedef std::move_iterator MI; + constexpr MI it1 = std::make_move_iterator(p); + constexpr MI it2 = std::make_move_iterator(p+1); + static_assert(it1.operator->() == p, ""); + static_assert(it2.operator->() == p + 1, ""); + } +#endif } Index: test/std/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.star/op_star.pass.cpp =================================================================== --- test/std/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.star/op_star.pass.cpp +++ test/std/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.star/op_star.pass.cpp @@ -12,6 +12,8 @@ // move_iterator // reference operator*() const; +// +// constexpr in C++17 #include #include @@ -19,6 +21,8 @@ #include #endif +#include "test_macros.h" + class A { int data_; @@ -58,4 +62,15 @@ std::unique_ptr p(&i); test(&p, std::unique_ptr(&i)); #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +#if TEST_STD_VER > 14 + { + constexpr const char *p = "123456789"; + typedef std::move_iterator MI; + constexpr MI it1 = std::make_move_iterator(p); + constexpr MI it2 = std::make_move_iterator(p+1); + static_assert(*it1 == p[0], ""); + static_assert(*it2 == p[1], ""); + } +#endif } Index: test/std/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op=/move_iterator.pass.cpp =================================================================== --- test/std/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op=/move_iterator.pass.cpp +++ test/std/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op=/move_iterator.pass.cpp @@ -15,10 +15,13 @@ // requires HasAssign // move_iterator& // operator=(const move_iterator& u); +// +// constexpr in C++17 #include #include +#include "test_macros.h" #include "test_iterators.h" template @@ -44,4 +47,14 @@ test >(bidirectional_iterator(&d)); test >(random_access_iterator(&d)); test(&d); +#if TEST_STD_VER > 14 + { + using BaseIter = std::move_iterator; + using DerivedIter = std::move_iterator; + constexpr const Derived *p = nullptr; + constexpr DerivedIter it1 = std::make_move_iterator(p); + constexpr BaseIter it2 = (BaseIter{nullptr} = it1); + static_assert(it2.base() == p, ""); + } +#endif }