diff options
author | Marshall Clow <mclow.lists@gmail.com> | 2016-10-19 15:12:50 +0000 |
---|---|---|
committer | Marshall Clow <mclow.lists@gmail.com> | 2016-10-19 15:12:50 +0000 |
commit | 1b8f260ed943e86023a1362ee5b45ff717d246d0 (patch) | |
tree | 0e4fe219f3be0566a2ac3fec71d02dbaf262261d /libcxx/test | |
parent | 5f05ea84d58d2b3044e5fad164bd7ebb22aff348 (diff) | |
download | bcm5719-llvm-1b8f260ed943e86023a1362ee5b45ff717d246d0.tar.gz bcm5719-llvm-1b8f260ed943e86023a1362ee5b45ff717d246d0.zip |
Implement constexpr support for reverse_iterator. Reviewed as https://reviews.llvm.org/D25534
llvm-svn: 284602
Diffstat (limited to 'libcxx/test')
23 files changed, 366 insertions, 23 deletions
diff --git a/libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.cons/default.pass.cpp b/libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.cons/default.pass.cpp index 72a767d1711..855dbd7ba31 100644 --- a/libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.cons/default.pass.cpp +++ b/libcxx/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 <iterator> +#include "test_macros.h" #include "test_iterators.h" template <class It> @@ -30,4 +33,10 @@ int main() test<random_access_iterator<char*> >(); test<char*>(); test<const char*>(); + +#if TEST_STD_VER > 14 + { + constexpr std::reverse_iterator<const char *> it; + } +#endif } diff --git a/libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.cons/iter.pass.cpp b/libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.cons/iter.pass.cpp index ea213c0dcf0..9bded7c5a42 100644 --- a/libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.cons/iter.pass.cpp +++ b/libcxx/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 <iterator> #include <cassert> +#include "test_macros.h" #include "test_iterators.h" template <class It> @@ -32,4 +35,12 @@ int main() test(bidirectional_iterator<const char*>(s)); test(random_access_iterator<const char*>(s)); test(s); + +#if TEST_STD_VER > 14 + { + constexpr const char *p = "123456789"; + constexpr std::reverse_iterator<const char *> it(p); + static_assert(it.base() == p); + } +#endif } diff --git a/libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.cons/reverse_iterator.pass.cpp b/libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.cons/reverse_iterator.pass.cpp index 280e7d59ae8..2c15743db50 100644 --- a/libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.cons/reverse_iterator.pass.cpp +++ b/libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.cons/reverse_iterator.pass.cpp @@ -13,11 +13,14 @@ // template <class U> // requires HasConstructor<Iter, const U&> -// reverse_iterator(const reverse_iterator<U> &u); +// constexpr reverse_iterator(const reverse_iterator<U> &u); +// +// constexpr in c++17 #include <iterator> #include <cassert> +#include "test_macros.h" #include "test_iterators.h" template <class It, class U> @@ -39,4 +42,13 @@ int main() test<bidirectional_iterator<Base*> >(bidirectional_iterator<Derived*>(&d)); test<random_access_iterator<const Base*> >(random_access_iterator<Derived*>(&d)); test<Base*>(&d); + +#if TEST_STD_VER > 14 + { + constexpr const Derived *p = nullptr; + constexpr std::reverse_iterator<const Derived *> it1 = std::make_reverse_iterator(p); + constexpr std::reverse_iterator<const Base *> it2(it1); + static_assert(it2.base() == p); + } +#endif } diff --git a/libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.make/make_reverse_iterator.pass.cpp b/libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.make/make_reverse_iterator.pass.cpp index 7ec287e5cd3..cd155988b11 100644 --- a/libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.make/make_reverse_iterator.pass.cpp +++ b/libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.make/make_reverse_iterator.pass.cpp @@ -12,12 +12,16 @@ // reverse_iterator -// template <class Iterator> reverse_iterator<Iterator> +// template <class Iterator> +// constexpr reverse_iterator<Iterator> // make_reverse_iterator(Iterator i); +// +// constexpr in c++17 #include <iterator> #include <cassert> +#include "test_macros.h" #include "test_iterators.h" template <class It> @@ -35,5 +39,13 @@ int main() random_access_iterator<const char*>e(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 } diff --git a/libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op!=/test.pass.cpp b/libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op!=/test.pass.cpp index 29da57e3b5a..f5162a7c5dc 100644 --- a/libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op!=/test.pass.cpp +++ b/libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op!=/test.pass.cpp @@ -13,12 +13,15 @@ // template <BidirectionalIterator Iter1, BidirectionalIterator Iter2> // requires HasEqualTo<Iter1, Iter2> -// bool +// constexpr bool // operator!=(const reverse_iterator<Iter1>& x, const reverse_iterator<Iter2>& y); +// +// constexpr in c++17 #include <iterator> #include <cassert> +#include "test_macros.h" #include "test_iterators.h" template <class It> @@ -39,4 +42,16 @@ int main() test(random_access_iterator<const char*>(s), random_access_iterator<const char*>(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<const char *> 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 } diff --git a/libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op++/post.pass.cpp b/libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op++/post.pass.cpp index bd936060c4d..6a2ab2797ca 100644 --- a/libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op++/post.pass.cpp +++ b/libcxx/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 <iterator> #include <cassert> +#include "test_macros.h" #include "test_iterators.h" template <class It> @@ -34,4 +37,17 @@ int main() test(bidirectional_iterator<const char*>(s+1), bidirectional_iterator<const char*>(s)); test(random_access_iterator<const char*>(s+1), random_access_iterator<const char*>(s)); test(s+1, s); + +#if TEST_STD_VER > 14 + { + constexpr const char *p = "123456789"; + typedef std::reverse_iterator<const char *> 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 } diff --git a/libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op++/pre.pass.cpp b/libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op++/pre.pass.cpp index f68a612fae6..51024224444 100644 --- a/libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op++/pre.pass.cpp +++ b/libcxx/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 <iterator> #include <cassert> +#include "test_macros.h" #include "test_iterators.h" template <class It> @@ -34,4 +37,18 @@ int main() test(bidirectional_iterator<const char*>(s+1), bidirectional_iterator<const char*>(s)); test(random_access_iterator<const char*>(s+1), random_access_iterator<const char*>(s)); test(s+1, s); + +#if TEST_STD_VER > 14 + { + constexpr const char *p = "123456789"; + typedef std::reverse_iterator<const char *> 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 } diff --git a/libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op+/difference_type.pass.cpp b/libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op+/difference_type.pass.cpp index 39129d6b64d..0c9682f45c1 100644 --- a/libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op+/difference_type.pass.cpp +++ b/libcxx/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<Iter> -// reverse_iterator operator+(difference_type n) const; +// constexpr reverse_iterator operator+(difference_type n) const; +// +// constexpr in c++17 #include <iterator> #include <cassert> +#include "test_macros.h" #include "test_iterators.h" template <class It> @@ -33,4 +36,17 @@ int main() const char* s = "1234567890"; test(random_access_iterator<const char*>(s+5), 5, random_access_iterator<const char*>(s)); test(s+5, 5, s); + +#if TEST_STD_VER > 14 + { + constexpr const char *p = "123456789"; + typedef std::reverse_iterator<const char *> 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 } diff --git a/libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op+=/difference_type.pass.cpp b/libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op+=/difference_type.pass.cpp index ac97aaf8c20..67ad1ae888e 100644 --- a/libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op+=/difference_type.pass.cpp +++ b/libcxx/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<Iter> -// reverse_iterator& operator+=(difference_type n); +// constexpr reverse_iterator& operator+=(difference_type n); +// +// constexpr in C++17 #include <iterator> #include <cassert> +#include "test_macros.h" #include "test_iterators.h" template <class It> @@ -34,4 +37,13 @@ int main() const char* s = "1234567890"; test(random_access_iterator<const char*>(s+5), 5, random_access_iterator<const char*>(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 } diff --git a/libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op--/post.pass.cpp b/libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op--/post.pass.cpp index c3126e8c21f..5a06ea5ad14 100644 --- a/libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op--/post.pass.cpp +++ b/libcxx/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 <iterator> #include <cassert> +#include "test_macros.h" #include "test_iterators.h" template <class It> @@ -34,4 +37,17 @@ int main() test(bidirectional_iterator<const char*>(s+1), bidirectional_iterator<const char*>(s+2)); test(random_access_iterator<const char*>(s+1), random_access_iterator<const char*>(s+2)); test(s+1, s+2); + +#if TEST_STD_VER > 14 + { + constexpr const char *p = "123456789"; + typedef std::reverse_iterator<const char *> 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 } diff --git a/libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op--/pre.pass.cpp b/libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op--/pre.pass.cpp index f9361cf9c72..3265624765e 100644 --- a/libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op--/pre.pass.cpp +++ b/libcxx/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 <iterator> #include <cassert> +#include "test_macros.h" #include "test_iterators.h" template <class It> @@ -34,4 +37,18 @@ int main() test(bidirectional_iterator<const char*>(s+1), bidirectional_iterator<const char*>(s+2)); test(random_access_iterator<const char*>(s+1), random_access_iterator<const char*>(s+2)); test(s+1, s+2); + +#if TEST_STD_VER > 14 + { + constexpr const char *p = "123456789"; + typedef std::reverse_iterator<const char *> 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 } diff --git a/libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op-/difference_type.pass.cpp b/libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op-/difference_type.pass.cpp index 79d477976fb..9148cc117ca 100644 --- a/libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op-/difference_type.pass.cpp +++ b/libcxx/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<Iter> -// reverse_iterator operator-(difference_type n) const; +// constexpr reverse_iterator operator-(difference_type n) const; +// +// constexpr in c++17 #include <iterator> #include <cassert> +#include "test_macros.h" #include "test_iterators.h" template <class It> @@ -33,4 +36,17 @@ int main() const char* s = "1234567890"; test(random_access_iterator<const char*>(s+5), 5, random_access_iterator<const char*>(s+10)); test(s+5, 5, s+10); + +#if TEST_STD_VER > 14 + { + constexpr const char *p = "123456789"; + typedef std::reverse_iterator<const char *> 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 } diff --git a/libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op-=/difference_type.pass.cpp b/libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op-=/difference_type.pass.cpp index 93addf99dc6..3bed189dc6a 100644 --- a/libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op-=/difference_type.pass.cpp +++ b/libcxx/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<Iter> -// reverse_iterator& operator-=(difference_type n); +// constexpr reverse_iterator& operator-=(difference_type n); +// +// constexpr in C++17 #include <iterator> #include <cassert> +#include "test_macros.h" #include "test_iterators.h" template <class It> @@ -34,4 +37,13 @@ int main() const char* s = "1234567890"; test(random_access_iterator<const char*>(s+5), 5, random_access_iterator<const char*>(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 } diff --git a/libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op.star/op_star.pass.cpp b/libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op.star/op_star.pass.cpp index 7a7759843ee..4e727564ab7 100644 --- a/libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op.star/op_star.pass.cpp +++ b/libcxx/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 <iterator> #include <cassert> +#include "test_macros.h" + class A { int data_; @@ -44,4 +48,15 @@ int main() { A a; test(&a+1, A()); + +#if TEST_STD_VER > 14 + { + constexpr const char *p = "123456789"; + typedef std::reverse_iterator<const char *> 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 } diff --git a/libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op=/reverse_iterator.pass.cpp b/libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op=/reverse_iterator.pass.cpp index 92573f9a924..78f6fc4cb26 100644 --- a/libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op=/reverse_iterator.pass.cpp +++ b/libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op=/reverse_iterator.pass.cpp @@ -13,12 +13,15 @@ // template <class U> // requires HasAssign<Iter, const U&> -// reverse_iterator& +// constexpr reverse_iterator& // operator=(const reverse_iterator<U>& u); +// +// constexpr in c++17 #include <iterator> #include <cassert> +#include "test_macros.h" #include "test_iterators.h" template <class It, class U> @@ -42,4 +45,15 @@ int main() test<bidirectional_iterator<Base*> >(bidirectional_iterator<Derived*>(&d)); test<random_access_iterator<const Base*> >(random_access_iterator<Derived*>(&d)); test<Base*>(&d); + +#if TEST_STD_VER > 14 + { + using BaseIter = std::reverse_iterator<const Base *>; + using DerivedIter = std::reverse_iterator<const Derived *>; + constexpr const Derived *p = nullptr; + constexpr DerivedIter it1 = std::make_reverse_iterator(p); + constexpr BaseIter it2 = (BaseIter{nullptr} = it1); + static_assert(it2.base() == p, ""); + } +#endif } diff --git a/libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op==/test.pass.cpp b/libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op==/test.pass.cpp index 3da4b951df1..ac9add5b9e3 100644 --- a/libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op==/test.pass.cpp +++ b/libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op==/test.pass.cpp @@ -13,12 +13,15 @@ // template <BidirectionalIterator Iter1, BidirectionalIterator Iter2> // requires HasEqualTo<Iter1, Iter2> -// bool +// constexpr bool // operator==(const reverse_iterator<Iter1>& x, const reverse_iterator<Iter2>& y); +// +// constexpr in c++17 #include <iterator> #include <cassert> +#include "test_macros.h" #include "test_iterators.h" template <class It> @@ -39,4 +42,17 @@ int main() test(random_access_iterator<const char*>(s), random_access_iterator<const char*>(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<const char *> 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 + } diff --git a/libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.opdiff/test.pass.cpp b/libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.opdiff/test.pass.cpp index 437bb6f9f7e..73e49027b0f 100644 --- a/libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.opdiff/test.pass.cpp +++ b/libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.opdiff/test.pass.cpp @@ -13,13 +13,16 @@ // template <RandomAccessIterator Iter1, RandomAccessIterator Iter2> // requires HasMinus<Iter2, Iter1> -// auto operator-(const reverse_iterator<Iter1>& x, const reverse_iterator<Iter2>& y) +// constexpr auto operator-(const reverse_iterator<Iter1>& x, const reverse_iterator<Iter2>& y) // -> decltype(y.base() - x.base()); +// +// constexpr in c++17 #include <iterator> #include <cstddef> #include <cassert> +#include "test_macros.h" #include "test_iterators.h" template <class It1, class It2> @@ -40,4 +43,15 @@ int main() 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<const char *> 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 } diff --git a/libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.opgt/test.pass.cpp b/libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.opgt/test.pass.cpp index afbb334ebfd..b6adcf40ede 100644 --- a/libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.opgt/test.pass.cpp +++ b/libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.opgt/test.pass.cpp @@ -13,12 +13,15 @@ // template <RandomAccessIterator Iter1, RandomAccessIterator Iter2> // requires HasGreater<Iter1, Iter2> -// bool +// constexpr bool // operator>(const reverse_iterator<Iter1>& x, const reverse_iterator<Iter2>& y); +// +// constexpr in c++17 #include <iterator> #include <cassert> +#include "test_macros.h" #include "test_iterators.h" template <class It> @@ -39,4 +42,16 @@ int main() 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<const char *> 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 } diff --git a/libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.opgt=/test.pass.cpp b/libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.opgt=/test.pass.cpp index c6e79aff126..dc917b29f90 100644 --- a/libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.opgt=/test.pass.cpp +++ b/libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.opgt=/test.pass.cpp @@ -13,12 +13,15 @@ // template <RandomAccessIterator Iter1, RandomAccessIterator Iter2> // requires HasGreater<Iter1, Iter2> -// bool +// constexpr bool // operator>=(const reverse_iterator<Iter1>& x, const reverse_iterator<Iter2>& y); +// +// constexpr in c++17 #include <iterator> #include <cassert> +#include "test_macros.h" #include "test_iterators.h" template <class It> @@ -39,4 +42,16 @@ int main() 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<const char *> 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 } diff --git a/libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.oplt/test.pass.cpp b/libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.oplt/test.pass.cpp index 2b389b853a5..668f7d83975 100644 --- a/libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.oplt/test.pass.cpp +++ b/libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.oplt/test.pass.cpp @@ -13,12 +13,15 @@ // template <RandomAccessIterator Iter1, RandomAccessIterator Iter2> // requires HasGreater<Iter1, Iter2> -// bool +// constexpr bool // operator<(const reverse_iterator<Iter1>& x, const reverse_iterator<Iter2>& y); +// +// constexpr in c++17 #include <iterator> #include <cassert> +#include "test_macros.h" #include "test_iterators.h" template <class It> @@ -39,4 +42,16 @@ int main() 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<const char *> 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 } diff --git a/libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.oplt=/test.pass.cpp b/libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.oplt=/test.pass.cpp index 6c4f05cdf65..5201bc43db2 100644 --- a/libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.oplt=/test.pass.cpp +++ b/libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.oplt=/test.pass.cpp @@ -13,12 +13,15 @@ // template <RandomAccessIterator Iter1, RandomAccessIterator Iter2> // requires HasGreater<Iter1, Iter2> -// bool +// constexpr bool // operator<=(const reverse_iterator<Iter1>& x, const reverse_iterator<Iter2>& y); +// +// constexpr in c++17 #include <iterator> #include <cassert> +#include "test_macros.h" #include "test_iterators.h" template <class It> @@ -39,4 +42,16 @@ int main() 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<const char *> 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 } diff --git a/libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.opref/op_arrow.pass.cpp b/libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.opref/op_arrow.pass.cpp index 404e8fbf19b..0202b3bdb62 100644 --- a/libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.opref/op_arrow.pass.cpp +++ b/libcxx/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 <list> #include <cassert> +#include "test_macros.h" + class A { int data_; @@ -59,6 +63,20 @@ public: 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 @@ int main() assert ( ri == l.rend ()); } } + +#if TEST_STD_VER > 14 + { + typedef std::reverse_iterator<const C *> RI; + constexpr RI it1 = std::make_reverse_iterator(&gC+1); + + static_assert(it1->get() == gC.get(), ""); + } +#endif } diff --git a/libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.opsum/difference_type.pass.cpp b/libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.opsum/difference_type.pass.cpp index 74747cb1f0f..00f739d09a5 100644 --- a/libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.opsum/difference_type.pass.cpp +++ b/libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.opsum/difference_type.pass.cpp @@ -12,12 +12,15 @@ // reverse_iterator // template <RandomAccessIterator Iterator> -// reverse_iterator<Iter> +// constexpr reverse_iterator<Iter> // operator+(Iter::difference_type n, const reverse_iterator<Iter>& x); +// +// constexpr in C++17 #include <iterator> #include <cassert> +#include "test_macros.h" #include "test_iterators.h" template <class It> @@ -34,4 +37,17 @@ int main() const char* s = "1234567890"; test(random_access_iterator<const char*>(s+5), 5, random_access_iterator<const char*>(s)); test(s+5, 5, s); + +#if TEST_STD_VER > 14 + { + constexpr const char *p = "123456789"; + typedef std::reverse_iterator<const char *> 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 } |