summaryrefslogtreecommitdiffstats
path: root/libcxx/test
diff options
context:
space:
mode:
Diffstat (limited to 'libcxx/test')
-rw-r--r--libcxx/test/libcxx/type_traits/convert_to_integral.pass.cpp89
-rw-r--r--libcxx/test/std/algorithms/alg.modifying.operations/alg.copy/copy_n.pass.cpp5
-rw-r--r--libcxx/test/std/algorithms/alg.modifying.operations/alg.fill/fill_n.pass.cpp21
-rw-r--r--libcxx/test/std/algorithms/alg.modifying.operations/alg.generate/generate_n.pass.cpp5
-rw-r--r--libcxx/test/std/algorithms/alg.nonmodifying/alg.search/search_n.pass.cpp4
-rw-r--r--libcxx/test/std/algorithms/alg.nonmodifying/alg.search/search_n_pred.pass.cpp6
-rw-r--r--libcxx/test/support/user_defined_integral.hpp44
7 files changed, 163 insertions, 11 deletions
diff --git a/libcxx/test/libcxx/type_traits/convert_to_integral.pass.cpp b/libcxx/test/libcxx/type_traits/convert_to_integral.pass.cpp
new file mode 100644
index 00000000000..ccdc7675ad6
--- /dev/null
+++ b/libcxx/test/libcxx/type_traits/convert_to_integral.pass.cpp
@@ -0,0 +1,89 @@
+
+#include <limits>
+#include <type_traits>
+#include <cstdint>
+#include <cassert>
+
+#include "user_defined_integral.hpp"
+
+template <class T>
+struct EnumType
+{
+ enum type : T {E_zero, E_one};
+};
+
+
+template <class From, class To>
+void check_integral_types()
+{
+ typedef std::numeric_limits<From> Limits;
+ const From max = Limits::max();
+ const From min = Limits::min();
+ {
+ auto ret = std::__convert_to_integral((From)max);
+ assert(ret == max);
+ ret = std::__convert_to_integral((From)min);
+ assert(ret == min);
+ static_assert(std::is_same<decltype(ret), To>::value, "");
+ }
+ {
+ UserDefinedIntegral<From> f(max);
+ auto ret = std::__convert_to_integral(f);
+ assert(ret == max);
+ f.value = min;
+ ret = std::__convert_to_integral(f);
+ assert(ret == min);
+ static_assert(std::is_same<decltype(ret), To>::value, "");
+ }
+ {
+ typedef typename EnumType<From>::type Enum;
+ Enum e(static_cast<Enum>(max));
+ auto ret = std::__convert_to_integral(e);
+ assert(ret == max);
+ e = static_cast<Enum>(min);
+ ret = std::__convert_to_integral(min);
+ assert(ret == min);
+ static_assert(std::is_same<decltype(ret), To>::value, "");
+ }
+}
+
+
+template <class From, class To>
+void check_enum_types()
+{
+ auto ret = std::__convert_to_integral((From)1);
+ assert(ret == 1);
+ static_assert(std::is_same<decltype(ret), To>::value, "");
+}
+
+
+enum enum1 {};
+enum enum2 {
+ value = std::numeric_limits<unsigned long>::max()
+};
+
+int main()
+{
+ check_integral_types<bool, int>();
+ check_integral_types<char, int>();
+ check_integral_types<signed char, int>();
+ check_integral_types<unsigned char, int>();
+ check_integral_types<wchar_t, int>();
+ check_integral_types<char16_t, int>();
+ check_integral_types<char32_t, uint32_t>();
+ check_integral_types<short, int>();
+ check_integral_types<unsigned short, int>();
+ check_integral_types<int, int>();
+ check_integral_types<unsigned, unsigned>();
+ check_integral_types<long, long>();
+ check_integral_types<unsigned long, unsigned long>();
+ check_integral_types<long long, long long>();
+ check_integral_types<unsigned long long, unsigned long long>();
+#ifndef _LIBCPP_HAS_NO_INT128
+ check_integral_types<__int128_t, __int128_t>();
+ check_integral_types<__uint128_t, __uint128_t>();
+#endif
+ // TODO(ericwf): Not standard
+ check_enum_types<enum1, unsigned>();
+ check_enum_types<enum2, unsigned long>();
+}
diff --git a/libcxx/test/std/algorithms/alg.modifying.operations/alg.copy/copy_n.pass.cpp b/libcxx/test/std/algorithms/alg.modifying.operations/alg.copy/copy_n.pass.cpp
index f594a0bf618..1dba8847c7e 100644
--- a/libcxx/test/std/algorithms/alg.modifying.operations/alg.copy/copy_n.pass.cpp
+++ b/libcxx/test/std/algorithms/alg.modifying.operations/alg.copy/copy_n.pass.cpp
@@ -17,6 +17,9 @@
#include <cassert>
#include "test_iterators.h"
+#include "user_defined_integral.hpp"
+
+typedef UserDefinedIntegral<unsigned> UDI;
template <class InIter, class OutIter>
void
@@ -28,7 +31,7 @@ test()
ia[i] = i;
int ib[N] = {0};
- OutIter r = std::copy_n(InIter(ia), N/2, OutIter(ib));
+ OutIter r = std::copy_n(InIter(ia), UDI(N/2), OutIter(ib));
assert(base(r) == ib+N/2);
for (unsigned i = 0; i < N/2; ++i)
assert(ia[i] == ib[i]);
diff --git a/libcxx/test/std/algorithms/alg.modifying.operations/alg.fill/fill_n.pass.cpp b/libcxx/test/std/algorithms/alg.modifying.operations/alg.fill/fill_n.pass.cpp
index bffcf1b63cb..6617cd0916f 100644
--- a/libcxx/test/std/algorithms/alg.modifying.operations/alg.fill/fill_n.pass.cpp
+++ b/libcxx/test/std/algorithms/alg.modifying.operations/alg.fill/fill_n.pass.cpp
@@ -18,6 +18,9 @@
#include <cassert>
#include "test_iterators.h"
+#include "user_defined_integral.hpp"
+
+typedef UserDefinedIntegral<unsigned> UDI;
template <class Iter>
void
@@ -25,7 +28,7 @@ test_char()
{
const unsigned n = 4;
char ca[n] = {0};
- assert(std::fill_n(Iter(ca), n, char(1)) == std::next(Iter(ca), n));
+ assert(std::fill_n(Iter(ca), UDI(n), char(1)) == std::next(Iter(ca), n));
assert(ca[0] == 1);
assert(ca[1] == 1);
assert(ca[2] == 1);
@@ -38,7 +41,7 @@ test_int()
{
const unsigned n = 4;
int ia[n] = {0};
- assert(std::fill_n(Iter(ia), n, 1) == std::next(Iter(ia), n));
+ assert(std::fill_n(Iter(ia), UDI(n), 1) == std::next(Iter(ia), n));
assert(ia[0] == 1);
assert(ia[1] == 1);
assert(ia[2] == 1);
@@ -50,7 +53,7 @@ test_int_array()
{
const unsigned n = 4;
int ia[n] = {0};
- assert(std::fill_n(ia, n, static_cast<char>(1)) == std::next(ia, n));
+ assert(std::fill_n(ia, UDI(n), static_cast<char>(1)) == std::next(ia, n));
assert(ia[0] == 1);
assert(ia[1] == 1);
assert(ia[2] == 1);
@@ -69,7 +72,7 @@ test_int_array_struct_source()
{
const unsigned n = 4;
int ia[n] = {0};
- assert(std::fill_n(ia, n, source()) == std::next(ia, n));
+ assert(std::fill_n(ia, UDI(n), source()) == std::next(ia, n));
assert(ia[0] == 0);
assert(ia[1] == 1);
assert(ia[2] == 2);
@@ -87,7 +90,7 @@ test_struct_array()
{
const unsigned n = 4;
test1 test1a[n] = {0};
- assert(std::fill_n(test1a, n, static_cast<char>(10)) == std::next(test1a, n));
+ assert(std::fill_n(test1a, UDI(n), static_cast<char>(10)) == std::next(test1a, n));
assert(test1a[0].c == 11);
assert(test1a[1].c == 11);
assert(test1a[2].c == 11);
@@ -110,7 +113,7 @@ void
test5()
{
A a[3];
- assert(std::fill_n(&a[0], 3, A('a')) == a+3);
+ assert(std::fill_n(&a[0], UDI(3), A('a')) == a+3);
assert(a[0] == A('a'));
assert(a[1] == A('a'));
assert(a[2] == A('a'));
@@ -124,11 +127,11 @@ struct Storage
unsigned char b;
};
};
-
+
void test6()
{
Storage foo[5];
- std::fill_n(&foo[0], 5, Storage());
+ std::fill_n(&foo[0], UDI(5), Storage());
}
@@ -143,7 +146,7 @@ int main()
test_int<bidirectional_iterator<int*> >();
test_int<random_access_iterator<int*> >();
test_int<int*>();
-
+
test_int_array();
test_int_array_struct_source();
test_struct_array();
diff --git a/libcxx/test/std/algorithms/alg.modifying.operations/alg.generate/generate_n.pass.cpp b/libcxx/test/std/algorithms/alg.modifying.operations/alg.generate/generate_n.pass.cpp
index 249419169a1..a9ccaf4cd95 100644
--- a/libcxx/test/std/algorithms/alg.modifying.operations/alg.generate/generate_n.pass.cpp
+++ b/libcxx/test/std/algorithms/alg.modifying.operations/alg.generate/generate_n.pass.cpp
@@ -19,6 +19,9 @@
#include <cassert>
#include "test_iterators.h"
+#include "user_defined_integral.hpp"
+
+typedef UserDefinedIntegral<unsigned> UDI;
struct gen_test
{
@@ -31,7 +34,7 @@ test()
{
const unsigned n = 4;
int ia[n] = {0};
- assert(std::generate_n(Iter(ia), n, gen_test()) == Iter(ia+n));
+ assert(std::generate_n(Iter(ia), UDI(n), gen_test()) == Iter(ia+n));
assert(ia[0] == 2);
assert(ia[1] == 2);
assert(ia[2] == 2);
diff --git a/libcxx/test/std/algorithms/alg.nonmodifying/alg.search/search_n.pass.cpp b/libcxx/test/std/algorithms/alg.nonmodifying/alg.search/search_n.pass.cpp
index b834da210d3..f7f8ee09279 100644
--- a/libcxx/test/std/algorithms/alg.nonmodifying/alg.search/search_n.pass.cpp
+++ b/libcxx/test/std/algorithms/alg.nonmodifying/alg.search/search_n.pass.cpp
@@ -18,6 +18,7 @@
#include <cassert>
#include "test_iterators.h"
+#include "user_defined_integral.hpp"
template <class Iter>
void
@@ -63,6 +64,9 @@ test()
assert(std::search_n(Iter(ic), Iter(ic+sc), 2, 0) == Iter(ic));
assert(std::search_n(Iter(ic), Iter(ic+sc), 3, 0) == Iter(ic));
assert(std::search_n(Iter(ic), Iter(ic+sc), 4, 0) == Iter(ic+sc));
+
+ // Check that we properly convert the size argument to an integral.
+ std::search_n(Iter(ic), Iter(ic+sc), UserDefinedIntegral<unsigned>(0), 0);
}
int main()
diff --git a/libcxx/test/std/algorithms/alg.nonmodifying/alg.search/search_n_pred.pass.cpp b/libcxx/test/std/algorithms/alg.nonmodifying/alg.search/search_n_pred.pass.cpp
index 6004b0e0a81..8bc6f4d26bd 100644
--- a/libcxx/test/std/algorithms/alg.nonmodifying/alg.search/search_n_pred.pass.cpp
+++ b/libcxx/test/std/algorithms/alg.nonmodifying/alg.search/search_n_pred.pass.cpp
@@ -18,6 +18,7 @@
#include <cassert>
#include "test_iterators.h"
+#include "user_defined_integral.hpp"
struct count_equal
{
@@ -29,6 +30,7 @@ struct count_equal
unsigned count_equal::count = 0;
+
template <class Iter>
void
test()
@@ -138,6 +140,10 @@ test()
assert(std::search_n(Iter(ic), Iter(ic+sc), 4, 0, count_equal()) == Iter(ic+sc));
assert(count_equal::count <= sc);
count_equal::count = 0;
+
+ // Check that we properly convert the size argument to an integral.
+ std::search_n(Iter(ic), Iter(ic+sc), UserDefinedIntegral<unsigned>(4), 0, count_equal());
+ count_equal::count = 0;
}
int main()
diff --git a/libcxx/test/support/user_defined_integral.hpp b/libcxx/test/support/user_defined_integral.hpp
new file mode 100644
index 00000000000..3b0f7a19fcf
--- /dev/null
+++ b/libcxx/test/support/user_defined_integral.hpp
@@ -0,0 +1,44 @@
+#ifndef SUPPORT_USER_DEFINED_INTEGRAL_HPP
+#define SUPPORT_USER_DEFINED_INTEGRAL_HPP
+
+template <class T>
+struct UserDefinedIntegral
+{
+ UserDefinedIntegral() : value(0) {}
+ UserDefinedIntegral(T v) : value(v) {}
+ operator T() const { return value; }
+ T value;
+};
+
+// Poison the arithmetic and comparison operations
+template <class T, class U>
+void operator+(UserDefinedIntegral<T>, UserDefinedIntegral<U>);
+
+template <class T, class U>
+void operator-(UserDefinedIntegral<T>, UserDefinedIntegral<U>);
+
+template <class T, class U>
+void operator*(UserDefinedIntegral<T>, UserDefinedIntegral<U>);
+
+template <class T, class U>
+void operator/(UserDefinedIntegral<T>, UserDefinedIntegral<U>);
+
+template <class T, class U>
+void operator==(UserDefinedIntegral<T>, UserDefinedIntegral<U>);
+
+template <class T, class U>
+void operator!=(UserDefinedIntegral<T>, UserDefinedIntegral<U>);
+
+template <class T, class U>
+void operator<(UserDefinedIntegral<T>, UserDefinedIntegral<U>);
+
+template <class T, class U>
+void operator>(UserDefinedIntegral<T>, UserDefinedIntegral<U>);
+
+template <class T, class U>
+void operator<=(UserDefinedIntegral<T>, UserDefinedIntegral<U>);
+
+template <class T, class U>
+void operator>=(UserDefinedIntegral<T>, UserDefinedIntegral<U>);
+
+#endif // SUPPORT_USER_DEFINED_INTEGRAL_HPP
OpenPOWER on IntegriCloud