diff options
Diffstat (limited to 'libcxx/test/std')
16 files changed, 451 insertions, 4 deletions
diff --git a/libcxx/test/std/diagnostics/syserr/syserr.hash/error_condition.pass.cpp b/libcxx/test/std/diagnostics/syserr/syserr.hash/error_condition.pass.cpp new file mode 100644 index 00000000000..eb3c06f2ed0 --- /dev/null +++ b/libcxx/test/std/diagnostics/syserr/syserr.hash/error_condition.pass.cpp @@ -0,0 +1,44 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <functional> + +// template <class T> +// struct hash +// : public unary_function<T, size_t> +// { +// size_t operator()(T val) const; +// }; + +#include <system_error> +#include <cassert> +#include <type_traits> + +#include "test_macros.h" + +void +test(int i) +{ + typedef std::error_condition T; + typedef std::hash<T> H; + static_assert((std::is_same<H::argument_type, T>::value), "" ); + static_assert((std::is_same<H::result_type, std::size_t>::value), "" ); + H h; + T ec(i, std::system_category()); + const std::size_t result = h(ec); + LIBCPP_ASSERT(result == i); + ((void)result); // Prevent unused warning +} + +int main() +{ + test(0); + test(2); + test(10); +} diff --git a/libcxx/test/std/numerics/numeric.ops/numeric.ops.gcd/gcd.bool1.fail.cpp b/libcxx/test/std/numerics/numeric.ops/numeric.ops.gcd/gcd.bool1.fail.cpp new file mode 100644 index 00000000000..cc821e1d8fc --- /dev/null +++ b/libcxx/test/std/numerics/numeric.ops/numeric.ops.gcd/gcd.bool1.fail.cpp @@ -0,0 +1,25 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// UNSUPPORTED: c++98, c++03, c++11, c++14 +// <numeric> + +// template<class _M, class _N> +// constexpr common_type_t<_M,_N> gcd(_M __m, _N __n) + +// Remarks: If either M or N is not an integer type, +// or if either is (a possibly cv-qualified) bool, the program is ill-formed. + +#include <numeric> + + +int main() +{ + std::gcd(false, 4); +} diff --git a/libcxx/test/std/numerics/numeric.ops/numeric.ops.gcd/gcd.bool2.fail.cpp b/libcxx/test/std/numerics/numeric.ops/numeric.ops.gcd/gcd.bool2.fail.cpp new file mode 100644 index 00000000000..1e5ee25655c --- /dev/null +++ b/libcxx/test/std/numerics/numeric.ops/numeric.ops.gcd/gcd.bool2.fail.cpp @@ -0,0 +1,25 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// UNSUPPORTED: c++98, c++03, c++11, c++14 +// <numeric> + +// template<class _M, class _N> +// constexpr common_type_t<_M,_N> gcd(_M __m, _N __n) + +// Remarks: If either M or N is not an integer type, +// or if either is (a possibly cv-qualified) bool, the program is ill-formed. + +#include <numeric> + + +int main() +{ + std::gcd(2, true); +} diff --git a/libcxx/test/std/numerics/numeric.ops/numeric.ops.gcd/gcd.bool3.fail.cpp b/libcxx/test/std/numerics/numeric.ops/numeric.ops.gcd/gcd.bool3.fail.cpp new file mode 100644 index 00000000000..76d1030d83a --- /dev/null +++ b/libcxx/test/std/numerics/numeric.ops/numeric.ops.gcd/gcd.bool3.fail.cpp @@ -0,0 +1,25 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// UNSUPPORTED: c++98, c++03, c++11, c++14 +// <numeric> + +// template<class _M, class _N> +// constexpr common_type_t<_M,_N> gcd(_M __m, _N __n) + +// Remarks: If either M or N is not an integer type, +// or if either is (a possibly cv-qualified) bool, the program is ill-formed. + +#include <numeric> + + +int main() +{ + std::gcd<volatile bool, int>(false, 4); +} diff --git a/libcxx/test/std/numerics/numeric.ops/numeric.ops.gcd/gcd.bool4.fail.cpp b/libcxx/test/std/numerics/numeric.ops/numeric.ops.gcd/gcd.bool4.fail.cpp new file mode 100644 index 00000000000..2c685c94b37 --- /dev/null +++ b/libcxx/test/std/numerics/numeric.ops/numeric.ops.gcd/gcd.bool4.fail.cpp @@ -0,0 +1,25 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// UNSUPPORTED: c++98, c++03, c++11, c++14 +// <numeric> + +// template<class _M, class _N> +// constexpr common_type_t<_M,_N> gcd(_M __m, _N __n) + +// Remarks: If either M or N is not an integer type, +// or if either is (a possibly cv-qualified) bool, the program is ill-formed. + +#include <numeric> + + +int main() +{ + std::gcd<int, const bool>(2, true); +} diff --git a/libcxx/test/std/numerics/numeric.ops/numeric.ops.gcd/gcd.not_integral1.fail.cpp b/libcxx/test/std/numerics/numeric.ops/numeric.ops.gcd/gcd.not_integral1.fail.cpp index 585e40bac8a..0707eca1e70 100644 --- a/libcxx/test/std/numerics/numeric.ops/numeric.ops.gcd/gcd.not_integral1.fail.cpp +++ b/libcxx/test/std/numerics/numeric.ops/numeric.ops.gcd/gcd.not_integral1.fail.cpp @@ -13,7 +13,8 @@ // template<class _M, class _N> // constexpr common_type_t<_M,_N> gcd(_M __m, _N __n) -// Remarks: If either M or N is not an integer type, the program is ill-formed. +// Remarks: If either M or N is not an integer type, +// or if either is (a possibly cv-qualified) bool, the program is ill-formed. #include <numeric> diff --git a/libcxx/test/std/numerics/numeric.ops/numeric.ops.gcd/gcd.not_integral2.fail.cpp b/libcxx/test/std/numerics/numeric.ops/numeric.ops.gcd/gcd.not_integral2.fail.cpp index 7a2709aa93b..113dd3d426a 100644 --- a/libcxx/test/std/numerics/numeric.ops/numeric.ops.gcd/gcd.not_integral2.fail.cpp +++ b/libcxx/test/std/numerics/numeric.ops/numeric.ops.gcd/gcd.not_integral2.fail.cpp @@ -13,7 +13,8 @@ // template<class _M, class _N> // constexpr common_type_t<_M,_N> gcd(_M __m, _N __n) -// Remarks: If either M or N is not an integer type, the program is ill-formed. +// Remarks: If either M or N is not an integer type, +// or if either is (a possibly cv-qualified) bool, the program is ill-formed. #include <numeric> diff --git a/libcxx/test/std/numerics/numeric.ops/numeric.ops.lcm/lcm.bool1.fail.cpp b/libcxx/test/std/numerics/numeric.ops/numeric.ops.lcm/lcm.bool1.fail.cpp new file mode 100644 index 00000000000..79c5f62db16 --- /dev/null +++ b/libcxx/test/std/numerics/numeric.ops/numeric.ops.lcm/lcm.bool1.fail.cpp @@ -0,0 +1,25 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// UNSUPPORTED: c++98, c++03, c++11, c++14 +// <numeric> + +// template<class _M, class _N> +// constexpr common_type_t<_M,_N> lcm(_M __m, _N __n) + +// Remarks: If either M or N is not an integer type, +// or if either is (a possibly cv-qualified) bool, the program is ill-formed. + +#include <numeric> + + +int main() +{ + std::lcm(false, 4); +} diff --git a/libcxx/test/std/numerics/numeric.ops/numeric.ops.lcm/lcm.bool2.fail.cpp b/libcxx/test/std/numerics/numeric.ops/numeric.ops.lcm/lcm.bool2.fail.cpp new file mode 100644 index 00000000000..c34efea176a --- /dev/null +++ b/libcxx/test/std/numerics/numeric.ops/numeric.ops.lcm/lcm.bool2.fail.cpp @@ -0,0 +1,25 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// UNSUPPORTED: c++98, c++03, c++11, c++14 +// <numeric> + +// template<class _M, class _N> +// constexpr common_type_t<_M,_N> lcm(_M __m, _N __n) + +// Remarks: If either M or N is not an integer type, +// or if either is (a possibly cv-qualified) bool, the program is ill-formed. + +#include <numeric> + + +int main() +{ + std::lcm(2, true); +} diff --git a/libcxx/test/std/numerics/numeric.ops/numeric.ops.lcm/lcm.bool3.fail.cpp b/libcxx/test/std/numerics/numeric.ops/numeric.ops.lcm/lcm.bool3.fail.cpp new file mode 100644 index 00000000000..8cb38eb2ada --- /dev/null +++ b/libcxx/test/std/numerics/numeric.ops/numeric.ops.lcm/lcm.bool3.fail.cpp @@ -0,0 +1,25 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// UNSUPPORTED: c++98, c++03, c++11, c++14 +// <numeric> + +// template<class _M, class _N> +// constexpr common_type_t<_M,_N> lcm(_M __m, _N __n) + +// Remarks: If either M or N is not an integer type, +// or if either is (a possibly cv-qualified) bool, the program is ill-formed. + +#include <numeric> + + +int main() +{ + std::lcm<volatile bool, int>(false, 4); +} diff --git a/libcxx/test/std/numerics/numeric.ops/numeric.ops.lcm/lcm.bool4.fail.cpp b/libcxx/test/std/numerics/numeric.ops/numeric.ops.lcm/lcm.bool4.fail.cpp new file mode 100644 index 00000000000..464eb03beb2 --- /dev/null +++ b/libcxx/test/std/numerics/numeric.ops/numeric.ops.lcm/lcm.bool4.fail.cpp @@ -0,0 +1,25 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// UNSUPPORTED: c++98, c++03, c++11, c++14 +// <numeric> + +// template<class _M, class _N> +// constexpr common_type_t<_M,_N> lcm(_M __m, _N __n) + +// Remarks: If either M or N is not an integer type, +// or if either is (a possibly cv-qualified) bool, the program is ill-formed. + +#include <numeric> + + +int main() +{ + std::lcm<int, const bool>(2, true); +} diff --git a/libcxx/test/std/numerics/numeric.ops/numeric.ops.lcm/lcm.not_integral1.fail.cpp b/libcxx/test/std/numerics/numeric.ops/numeric.ops.lcm/lcm.not_integral1.fail.cpp index 1e69b25b190..ce6bcf88b30 100644 --- a/libcxx/test/std/numerics/numeric.ops/numeric.ops.lcm/lcm.not_integral1.fail.cpp +++ b/libcxx/test/std/numerics/numeric.ops/numeric.ops.lcm/lcm.not_integral1.fail.cpp @@ -13,7 +13,8 @@ // template<class _M, class _N> // constexpr common_type_t<_M,_N> lcm(_M __m, _N __n) -// Remarks: If either M or N is not an integer type, the program is ill-formed. +// Remarks: If either M or N is not an integer type, +// or if either is (a possibly cv-qualified) bool, the program is ill-formed. #include <numeric> diff --git a/libcxx/test/std/numerics/numeric.ops/numeric.ops.lcm/lcm.not_integral2.fail.cpp b/libcxx/test/std/numerics/numeric.ops/numeric.ops.lcm/lcm.not_integral2.fail.cpp index d58d903a23c..a9100989bf4 100644 --- a/libcxx/test/std/numerics/numeric.ops/numeric.ops.lcm/lcm.not_integral2.fail.cpp +++ b/libcxx/test/std/numerics/numeric.ops/numeric.ops.lcm/lcm.not_integral2.fail.cpp @@ -13,7 +13,8 @@ // template<class _M, class _N> // constexpr common_type_t<_M,_N> lcm(_M __m, _N __n) -// Remarks: If either M or N is not an integer type, the program is ill-formed. +// Remarks: If either M or N is not an integer type, +// or if either is (a possibly cv-qualified) bool, the program is ill-formed. #include <numeric> diff --git a/libcxx/test/std/strings/basic.string/string.cons/T_size_size.pass.cpp b/libcxx/test/std/strings/basic.string/string.cons/T_size_size.pass.cpp new file mode 100644 index 00000000000..edc0f124f69 --- /dev/null +++ b/libcxx/test/std/strings/basic.string/string.cons/T_size_size.pass.cpp @@ -0,0 +1,166 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <string> + +// template<class _Tp> +// basic_string(const _Tp& __t, size_type __pos, size_type __n, +// const allocator_type& __a = allocator_type()); +// +// Mostly we're testing string_view here + +#include <string> +#include <string_view> +#include <stdexcept> +#include <algorithm> +#include <cassert> + +#include "test_macros.h" +#include "test_allocator.h" +#include "min_allocator.h" + +template <class S, class SV> +void +test(SV sv, unsigned pos, unsigned n) +{ + typedef typename S::traits_type T; + typedef typename S::allocator_type A; + try + { + S s2(sv, pos, n); + LIBCPP_ASSERT(s2.__invariants()); + assert(pos <= sv.size()); + unsigned rlen = std::min<unsigned>(sv.size() - pos, n); + assert(s2.size() == rlen); + assert(T::compare(s2.data(), sv.data() + pos, rlen) == 0); + assert(s2.get_allocator() == A()); + assert(s2.capacity() >= s2.size()); + } + catch (std::out_of_range&) + { + assert(pos > sv.size()); + } +} + +template <class S, class SV> +void +test(SV sv, unsigned pos, unsigned n, const typename S::allocator_type& a) +{ + typedef typename S::traits_type T; + typedef typename S::allocator_type A; + try + { + S s2(sv, pos, n, a); + LIBCPP_ASSERT(s2.__invariants()); + assert(pos <= sv.size()); + unsigned rlen = std::min<unsigned>(sv.size() - pos, n); + assert(s2.size() == rlen); + assert(T::compare(s2.data(), sv.data() + pos, rlen) == 0); + assert(s2.get_allocator() == a); + assert(s2.capacity() >= s2.size()); + } + catch (std::out_of_range&) + { + assert(pos > sv.size()); + } +} + +int main() +{ + + { + typedef test_allocator<char> A; + typedef std::basic_string_view<char, std::char_traits<char> > SV; + typedef std::basic_string <char, std::char_traits<char>, A> S; + + test<S,SV>(SV(), 0, 0); + test<S,SV>(SV(), 0, 1); + test<S,SV>(SV(), 1, 0); + test<S,SV>(SV(), 1, 1); + test<S,SV>(SV(), 1, 2); + test<S,SV>(SV("1"), 0, 0); + test<S,SV>(SV("1"), 0, 1); + test<S,SV>(SV("1234567890123456789012345678901234567890123456789012345678901234567890"), 50, 0); + test<S,SV>(SV("1234567890123456789012345678901234567890123456789012345678901234567890"), 50, 1); + test<S,SV>(SV("1234567890123456789012345678901234567890123456789012345678901234567890"), 50, 10); + test<S,SV>(SV("1234567890123456789012345678901234567890123456789012345678901234567890"), 50, 100); + + test<S,SV>(SV(), 0, 0, A(4)); + test<S,SV>(SV(), 0, 1, A(4)); + test<S,SV>(SV(), 1, 0, A(4)); + test<S,SV>(SV(), 1, 1, A(4)); + test<S,SV>(SV(), 1, 2, A(4)); + test<S,SV>(SV("1"), 0, 0, A(6)); + test<S,SV>(SV("1"), 0, 1, A(6)); + test<S,SV>(SV("1234567890123456789012345678901234567890123456789012345678901234567890"), 50, 0, A(8)); + test<S,SV>(SV("1234567890123456789012345678901234567890123456789012345678901234567890"), 50, 1, A(8)); + test<S,SV>(SV("1234567890123456789012345678901234567890123456789012345678901234567890"), 50, 10, A(8)); + test<S,SV>(SV("1234567890123456789012345678901234567890123456789012345678901234567890"), 50, 100, A(8)); + } + +#if TEST_STD_VER >= 11 + { + typedef min_allocator<char> A; + typedef std::basic_string_view<char, std::char_traits<char> > SV; + typedef std::basic_string <char, std::char_traits<char>, A> S; + + test<S,SV>(SV(), 0, 0); + test<S,SV>(SV(), 0, 1); + test<S,SV>(SV(), 1, 0); + test<S,SV>(SV(), 1, 1); + test<S,SV>(SV(), 1, 2); + test<S,SV>(SV("1"), 0, 0); + test<S,SV>(SV("1"), 0, 1); + test<S,SV>(SV("1234567890123456789012345678901234567890123456789012345678901234567890"), 50, 0); + test<S,SV>(SV("1234567890123456789012345678901234567890123456789012345678901234567890"), 50, 1); + test<S,SV>(SV("1234567890123456789012345678901234567890123456789012345678901234567890"), 50, 10); + test<S,SV>(SV("1234567890123456789012345678901234567890123456789012345678901234567890"), 50, 100); + + test<S,SV>(SV(), 0, 0, A()); + test<S,SV>(SV(), 0, 1, A()); + test<S,SV>(SV(), 1, 0, A()); + test<S,SV>(SV(), 1, 1, A()); + test<S,SV>(SV(), 1, 2, A()); + test<S,SV>(SV("1"), 0, 0, A()); + test<S,SV>(SV("1"), 0, 1, A()); + test<S,SV>(SV("1234567890123456789012345678901234567890123456789012345678901234567890"), 50, 0, A()); + test<S,SV>(SV("1234567890123456789012345678901234567890123456789012345678901234567890"), 50, 1, A()); + test<S,SV>(SV("1234567890123456789012345678901234567890123456789012345678901234567890"), 50, 10, A()); + test<S,SV>(SV("1234567890123456789012345678901234567890123456789012345678901234567890"), 50, 100, A()); + } +#endif + { + typedef std::string S; + typedef std::string_view SV; + S s = "ABCD"; + SV sv = "EFGH"; + char arr[] = "IJKL"; + + S s1("CDEF", 4); // calls ctor(const char *, len) + assert(s1 == "CDEF"); + + S s2("QRST", 0, 3); // calls ctor(string("QRST", pos, len) + assert(s2 == "QRS"); + + S s3(sv, 0, std::string::npos); // calls ctor(T, pos, npos) + assert(s3 == sv); + + S s4(sv, 0, 3); // calls ctor(T, pos, len) + assert(s4 == "EFG"); + + S s5(arr, 0, 2); // calls ctor(const char *, len) + assert(s5 == "IJ"); + + S s6(arr, 0); // calls ctor(const char *, len) + assert(s6 == ""); + + S s7(s.data(), 2); // calls ctor(const char *, len) + assert(s7 == "AB"); + } +} diff --git a/libcxx/test/std/utilities/memory/specialized.algorithms/specialized.addressof/addressof.temp.fail.cpp b/libcxx/test/std/utilities/memory/specialized.algorithms/specialized.addressof/addressof.temp.fail.cpp new file mode 100644 index 00000000000..8bac4480ed3 --- /dev/null +++ b/libcxx/test/std/utilities/memory/specialized.algorithms/specialized.addressof/addressof.temp.fail.cpp @@ -0,0 +1,20 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <memory> + +// template <ObjectType T> T* addressof(T&& r) = delete; + +#include <memory> +#include <cassert> + +int main() +{ + const int *p = std::addressof<const int>(0); +} diff --git a/libcxx/test/std/utilities/time/time.point/time.point.nonmember/op_-duration.pass.cpp b/libcxx/test/std/utilities/time/time.point/time.point.nonmember/op_-duration.pass.cpp index 4c681fa32e5..978f09d66bb 100644 --- a/libcxx/test/std/utilities/time/time.point/time.point.nonmember/op_-duration.pass.cpp +++ b/libcxx/test/std/utilities/time/time.point/time.point.nonmember/op_-duration.pass.cpp @@ -20,6 +20,17 @@ #include "test_macros.h" +template <class D> +void test2739() // LWG2739 +{ + typedef std::chrono::time_point<std::chrono::system_clock> TimePoint; + typedef std::chrono::duration<D> Dur; + const Dur d(5); + TimePoint t0 = std::chrono::system_clock::from_time_t(200); + TimePoint t1 = t0 - d; + assert(t1 < t0); +} + int main() { typedef std::chrono::system_clock Clock; @@ -37,4 +48,6 @@ int main() static_assert(t2.time_since_epoch() == Duration2(2995), ""); } #endif + test2739<int32_t>(); + test2739<uint32_t>(); } |