summaryrefslogtreecommitdiffstats
path: root/libcxx/test
diff options
context:
space:
mode:
authorMarshall Clow <mclow.lists@gmail.com>2016-10-19 15:12:50 +0000
committerMarshall Clow <mclow.lists@gmail.com>2016-10-19 15:12:50 +0000
commit1b8f260ed943e86023a1362ee5b45ff717d246d0 (patch)
tree0e4fe219f3be0566a2ac3fec71d02dbaf262261d /libcxx/test
parent5f05ea84d58d2b3044e5fad164bd7ebb22aff348 (diff)
downloadbcm5719-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')
-rw-r--r--libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.cons/default.pass.cpp11
-rw-r--r--libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.cons/iter.pass.cpp13
-rw-r--r--libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.cons/reverse_iterator.pass.cpp14
-rw-r--r--libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.make/make_reverse_iterator.pass.cpp14
-rw-r--r--libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op!=/test.pass.cpp17
-rw-r--r--libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op++/post.pass.cpp18
-rw-r--r--libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op++/pre.pass.cpp19
-rw-r--r--libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op+/difference_type.pass.cpp18
-rw-r--r--libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op+=/difference_type.pass.cpp14
-rw-r--r--libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op--/post.pass.cpp18
-rw-r--r--libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op--/pre.pass.cpp19
-rw-r--r--libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op-/difference_type.pass.cpp18
-rw-r--r--libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op-=/difference_type.pass.cpp14
-rw-r--r--libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op.star/op_star.pass.cpp17
-rw-r--r--libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op=/reverse_iterator.pass.cpp16
-rw-r--r--libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op==/test.pass.cpp18
-rw-r--r--libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.opdiff/test.pass.cpp16
-rw-r--r--libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.opgt/test.pass.cpp17
-rw-r--r--libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.opgt=/test.pass.cpp17
-rw-r--r--libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.oplt/test.pass.cpp17
-rw-r--r--libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.oplt=/test.pass.cpp17
-rw-r--r--libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.opref/op_arrow.pass.cpp29
-rw-r--r--libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.opsum/difference_type.pass.cpp18
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
}
OpenPOWER on IntegriCloud