diff options
Diffstat (limited to 'libcxx/test')
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 |