aboutsummaryrefslogtreecommitdiff
path: root/libcxx/test/std/numerics/numeric.ops/inclusive.scan/inclusive_scan_op.pass.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libcxx/test/std/numerics/numeric.ops/inclusive.scan/inclusive_scan_op.pass.cpp')
-rw-r--r--libcxx/test/std/numerics/numeric.ops/inclusive.scan/inclusive_scan_op.pass.cpp83
1 files changed, 60 insertions, 23 deletions
diff --git a/libcxx/test/std/numerics/numeric.ops/inclusive.scan/inclusive_scan_op.pass.cpp b/libcxx/test/std/numerics/numeric.ops/inclusive.scan/inclusive_scan_op.pass.cpp
index 322b502369f3..00092a69317c 100644
--- a/libcxx/test/std/numerics/numeric.ops/inclusive.scan/inclusive_scan_op.pass.cpp
+++ b/libcxx/test/std/numerics/numeric.ops/inclusive.scan/inclusive_scan_op.pass.cpp
@@ -8,7 +8,9 @@
// <numeric>
// UNSUPPORTED: c++03, c++11, c++14
+// UNSUPPORTED: clang-8
+// Became constexpr in C++20
// template<class InputIterator, class OutputIterator, class T, class BinaryOperation>
// OutputIterator
// inclusive_scan(InputIterator first, InputIterator last,
@@ -17,6 +19,7 @@
#include <numeric>
#include <algorithm>
+#include <array>
#include <cassert>
#include <functional>
#include <iterator>
@@ -24,27 +27,43 @@
#include "test_macros.h"
#include "test_iterators.h"
+// FIXME Remove constexpr vector workaround introduced in D90569
+#if TEST_STD_VER > 17
+#include <span>
+#endif
-template <class Iter1, class T, class Op, class Iter2>
-void
+template <class Iter1, class Op, class Iter2>
+TEST_CONSTEXPR_CXX20 void
test(Iter1 first, Iter1 last, Op op, Iter2 rFirst, Iter2 rLast)
{
- std::vector<typename std::iterator_traits<Iter1>::value_type> v;
+ // C++17 doesn't test constexpr so can use a vector.
+ // C++20 can use vector in constexpr evaluation, but both libc++ and MSVC
+ // don't have the support yet. In these cases use a std::span for the test.
+ // FIXME Remove constexpr vector workaround introduced in D90569
+ size_t size = std::distance(first, last);
+#if TEST_STD_VER < 20 || \
+ (defined(__cpp_lib_constexpr_vector) && __cpp_lib_constexpr_vector >= 201907L)
+
+ std::vector<typename std::iterator_traits<Iter1>::value_type> v(size);
+#else
+ assert((size <= 5) && "Increment the size of the array");
+ typename std::iterator_traits<Iter1>::value_type b[5];
+ std::span<typename std::iterator_traits<Iter1>::value_type> v{b, size};
+#endif
// Not in place
- std::inclusive_scan(first, last, std::back_inserter(v), op);
+ std::inclusive_scan(first, last, v.begin(), op);
assert(std::equal(v.begin(), v.end(), rFirst, rLast));
// In place
- v.clear();
- v.assign(first, last);
+ std::copy(first, last, v.begin());
std::inclusive_scan(v.begin(), v.end(), v.begin(), op);
assert(std::equal(v.begin(), v.end(), rFirst, rLast));
}
template <class Iter>
-void
+TEST_CONSTEXPR_CXX20 void
test()
{
int ia[] = {1, 3, 5, 7, 9};
@@ -60,13 +79,14 @@ test()
}
}
-size_t triangle(size_t n) { return n*(n+1)/2; }
+constexpr size_t triangle(size_t n) { return n*(n+1)/2; }
// Basic sanity
-void basic_tests()
+TEST_CONSTEXPR_CXX20 void
+basic_tests()
{
{
- std::vector<size_t> v(10);
+ std::array<size_t, 10> v;
std::fill(v.begin(), v.end(), 3);
std::inclusive_scan(v.begin(), v.end(), v.begin(), std::plus<>());
for (size_t i = 0; i < v.size(); ++i)
@@ -74,7 +94,7 @@ void basic_tests()
}
{
- std::vector<size_t> v(10);
+ std::array<size_t, 10> v;
std::iota(v.begin(), v.end(), 0);
std::inclusive_scan(v.begin(), v.end(), v.begin(), std::plus<>());
for (size_t i = 0; i < v.size(); ++i)
@@ -82,7 +102,7 @@ void basic_tests()
}
{
- std::vector<size_t> v(10);
+ std::array<size_t, 10> v;
std::iota(v.begin(), v.end(), 1);
std::inclusive_scan(v.begin(), v.end(), v.begin(), std::plus<>());
for (size_t i = 0; i < v.size(); ++i)
@@ -90,26 +110,43 @@ void basic_tests()
}
{
+ // C++17 doesn't test constexpr so can use a vector.
+ // C++20 can use vector in constexpr evaluation, but both libc++ and MSVC
+ // don't have the support yet. In these cases use a std::span for the test.
+ // FIXME Remove constexpr vector workaround introduced in D90569
+#if TEST_STD_VER < 20 || \
+ (defined(__cpp_lib_constexpr_vector) && __cpp_lib_constexpr_vector >= 201907L)
std::vector<size_t> v, res;
std::inclusive_scan(v.begin(), v.end(), std::back_inserter(res), std::plus<>());
+#else
+ std::array<size_t, 0> v, res;
+ std::inclusive_scan(v.begin(), v.end(), res.begin(), std::plus<>());
+#endif
assert(res.empty());
}
}
-
-int main(int, char**)
+TEST_CONSTEXPR_CXX20 bool
+test()
{
-
basic_tests();
// All the iterator categories
-// test<input_iterator <const int*> >();
-// test<forward_iterator <const int*> >();
-// test<bidirectional_iterator<const int*> >();
-// test<random_access_iterator<const int*> >();
-// test<const int*>();
-// test< int*>();
-
+ test<input_iterator <const int*> >();
+ test<forward_iterator <const int*> >();
+ test<bidirectional_iterator<const int*> >();
+ test<random_access_iterator<const int*> >();
+ test<const int*>();
+ test< int*>();
+
+ return true;
+}
- return 0;
+int main(int, char**)
+{
+ test();
+#if TEST_STD_VER > 17
+ static_assert(test());
+#endif
+ return 0;
}