diff options
author | Howard Hinnant <hhinnant@apple.com> | 2010-05-11 19:42:16 +0000 |
---|---|---|
committer | Howard Hinnant <hhinnant@apple.com> | 2010-05-11 19:42:16 +0000 |
commit | 3e519524c118651123eecf60c2bbc5d65ad9bac3 (patch) | |
tree | b2dd4168cfe448920a602cd7d2e40f95da187153 /libcxx/test/language.support | |
parent | 9132c59d43b6c590c9bb33496eebf9f192d6857a (diff) | |
download | bcm5719-llvm-3e519524c118651123eecf60c2bbc5d65ad9bac3.tar.gz bcm5719-llvm-3e519524c118651123eecf60c2bbc5d65ad9bac3.zip |
libcxx initial import
llvm-svn: 103490
Diffstat (limited to 'libcxx/test/language.support')
109 files changed, 4582 insertions, 0 deletions
diff --git a/libcxx/test/language.support/cstdint/cstdint.syn/cstdint.pass.cpp b/libcxx/test/language.support/cstdint/cstdint.syn/cstdint.pass.cpp new file mode 100644 index 00000000000..29bdd312d2d --- /dev/null +++ b/libcxx/test/language.support/cstdint/cstdint.syn/cstdint.pass.cpp @@ -0,0 +1,290 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// test <cstdint> + +#include <cstdint> +#include <csignal> +#include <cwctype> +#include <climits> +#include <type_traits> +#include <limits> +#include <cassert> + +int main() +{ + // typedef std::int8_t + static_assert(sizeof(std::int8_t)*CHAR_BIT == 8, + "sizeof(std::int8_t)*CHAR_BIT == 8"); + static_assert(std::is_signed<std::int8_t>::value, + "std::is_signed<std::int8_t>::value"); + // typedef std::int16_t + static_assert(sizeof(std::int16_t)*CHAR_BIT == 16, + "sizeof(std::int16_t)*CHAR_BIT == 16"); + static_assert(std::is_signed<std::int16_t>::value, + "std::is_signed<std::int16_t>::value"); + // typedef std::int32_t + static_assert(sizeof(std::int32_t)*CHAR_BIT == 32, + "sizeof(std::int32_t)*CHAR_BIT == 32"); + static_assert(std::is_signed<std::int32_t>::value, + "std::is_signed<std::int32_t>::value"); + // typedef std::int64_t + static_assert(sizeof(std::int64_t)*CHAR_BIT == 64, + "sizeof(std::int64_t)*CHAR_BIT == 64"); + static_assert(std::is_signed<std::int64_t>::value, + "std::is_signed<std::int64_t>::value"); + + // typedef std::uint8_t + static_assert(sizeof(std::uint8_t)*CHAR_BIT == 8, + "sizeof(std::uint8_t)*CHAR_BIT == 8"); + static_assert(std::is_unsigned<std::uint8_t>::value, + "std::is_unsigned<std::uint8_t>::value"); + // typedef std::uint16_t + static_assert(sizeof(std::uint16_t)*CHAR_BIT == 16, + "sizeof(std::uint16_t)*CHAR_BIT == 16"); + static_assert(std::is_unsigned<std::uint16_t>::value, + "std::is_unsigned<std::uint16_t>::value"); + // typedef std::uint32_t + static_assert(sizeof(std::uint32_t)*CHAR_BIT == 32, + "sizeof(std::uint32_t)*CHAR_BIT == 32"); + static_assert(std::is_unsigned<std::uint32_t>::value, + "std::is_unsigned<std::uint32_t>::value"); + // typedef std::uint64_t + static_assert(sizeof(std::uint64_t)*CHAR_BIT == 64, + "sizeof(std::uint64_t)*CHAR_BIT == 64"); + static_assert(std::is_unsigned<std::uint64_t>::value, + "std::is_unsigned<std::uint64_t>::value"); + + // typedef std::int_least8_t + static_assert(sizeof(std::int_least8_t)*CHAR_BIT >= 8, + "sizeof(std::int_least8_t)*CHAR_BIT >= 8"); + static_assert(std::is_signed<std::int_least8_t>::value, + "std::is_signed<std::int_least8_t>::value"); + // typedef std::int_least16_t + static_assert(sizeof(std::int_least16_t)*CHAR_BIT >= 16, + "sizeof(std::int_least16_t)*CHAR_BIT >= 16"); + static_assert(std::is_signed<std::int_least16_t>::value, + "std::is_signed<std::int_least16_t>::value"); + // typedef std::int_least32_t + static_assert(sizeof(std::int_least32_t)*CHAR_BIT >= 32, + "sizeof(std::int_least32_t)*CHAR_BIT >= 32"); + static_assert(std::is_signed<std::int_least32_t>::value, + "std::is_signed<std::int_least32_t>::value"); + // typedef std::int_least64_t + static_assert(sizeof(std::int_least64_t)*CHAR_BIT >= 64, + "sizeof(std::int_least64_t)*CHAR_BIT >= 64"); + static_assert(std::is_signed<std::int_least64_t>::value, + "std::is_signed<std::int_least64_t>::value"); + + // typedef std::uint_least8_t + static_assert(sizeof(std::uint_least8_t)*CHAR_BIT >= 8, + "sizeof(std::uint_least8_t)*CHAR_BIT >= 8"); + static_assert(std::is_unsigned<std::uint_least8_t>::value, + "std::is_unsigned<std::uint_least8_t>::value"); + // typedef std::uint_least16_t + static_assert(sizeof(std::uint_least16_t)*CHAR_BIT >= 16, + "sizeof(std::uint_least16_t)*CHAR_BIT >= 16"); + static_assert(std::is_unsigned<std::uint_least16_t>::value, + "std::is_unsigned<std::uint_least16_t>::value"); + // typedef std::uint_least32_t + static_assert(sizeof(std::uint_least32_t)*CHAR_BIT >= 32, + "sizeof(std::uint_least32_t)*CHAR_BIT >= 32"); + static_assert(std::is_unsigned<std::uint_least32_t>::value, + "std::is_unsigned<std::uint_least32_t>::value"); + // typedef std::uint_least64_t + static_assert(sizeof(std::uint_least64_t)*CHAR_BIT >= 64, + "sizeof(std::uint_least64_t)*CHAR_BIT >= 64"); + static_assert(std::is_unsigned<std::uint_least64_t>::value, + "std::is_unsigned<std::uint_least64_t>::value"); + + // typedef std::int_fast8_t + static_assert(sizeof(std::int_fast8_t)*CHAR_BIT >= 8, + "sizeof(std::int_fast8_t)*CHAR_BIT >= 8"); + static_assert(std::is_signed<std::int_fast8_t>::value, + "std::is_signed<std::int_fast8_t>::value"); + // typedef std::int_fast16_t + static_assert(sizeof(std::int_fast16_t)*CHAR_BIT >= 16, + "sizeof(std::int_fast16_t)*CHAR_BIT >= 16"); + static_assert(std::is_signed<std::int_fast16_t>::value, + "std::is_signed<std::int_fast16_t>::value"); + // typedef std::int_fast32_t + static_assert(sizeof(std::int_fast32_t)*CHAR_BIT >= 32, + "sizeof(std::int_fast32_t)*CHAR_BIT >= 32"); + static_assert(std::is_signed<std::int_fast32_t>::value, + "std::is_signed<std::int_fast32_t>::value"); + // typedef std::int_fast64_t + static_assert(sizeof(std::int_fast64_t)*CHAR_BIT >= 64, + "sizeof(std::int_fast64_t)*CHAR_BIT >= 64"); + static_assert(std::is_signed<std::int_fast64_t>::value, + "std::is_signed<std::int_fast64_t>::value"); + + // typedef std::uint_fast8_t + static_assert(sizeof(std::uint_fast8_t)*CHAR_BIT >= 8, + "sizeof(std::uint_fast8_t)*CHAR_BIT >= 8"); + static_assert(std::is_unsigned<std::uint_fast8_t>::value, + "std::is_unsigned<std::uint_fast8_t>::value"); + // typedef std::uint_fast16_t + static_assert(sizeof(std::uint_fast16_t)*CHAR_BIT >= 16, + "sizeof(std::uint_fast16_t)*CHAR_BIT >= 16"); + static_assert(std::is_unsigned<std::uint_fast16_t>::value, + "std::is_unsigned<std::uint_fast16_t>::value"); + // typedef std::uint_fast32_t + static_assert(sizeof(std::uint_fast32_t)*CHAR_BIT >= 32, + "sizeof(std::uint_fast32_t)*CHAR_BIT >= 32"); + static_assert(std::is_unsigned<std::uint_fast32_t>::value, + "std::is_unsigned<std::uint_fast32_t>::value"); + // typedef std::uint_fast64_t + static_assert(sizeof(std::uint_fast64_t)*CHAR_BIT >= 64, + "sizeof(std::uint_fast64_t)*CHAR_BIT >= 64"); + static_assert(std::is_unsigned<std::uint_fast64_t>::value, + "std::is_unsigned<std::uint_fast64_t>::value"); + + // typedef std::intptr_t + static_assert(sizeof(std::intptr_t) >= sizeof(void*), + "sizeof(std::intptr_t) >= sizeof(void*)"); + static_assert(std::is_signed<std::intptr_t>::value, + "std::is_signed<std::intptr_t>::value"); + // typedef std::uintptr_t + static_assert(sizeof(std::uintptr_t) >= sizeof(void*), + "sizeof(std::uintptr_t) >= sizeof(void*)"); + static_assert(std::is_unsigned<std::uintptr_t>::value, + "std::is_unsigned<std::uintptr_t>::value"); + + // typedef std::intmax_t + static_assert(sizeof(std::intmax_t) >= sizeof(long long), + "sizeof(std::intmax_t) >= sizeof(long long)"); + static_assert(std::is_signed<std::intmax_t>::value, + "std::is_signed<std::intmax_t>::value"); + // typedef std::uintmax_t + static_assert(sizeof(std::uintmax_t) >= sizeof(unsigned long long), + "sizeof(std::uintmax_t) >= sizeof(unsigned long long)"); + static_assert(std::is_unsigned<std::uintmax_t>::value, + "std::is_unsigned<std::uintmax_t>::value"); + + // INTN_MIN + static_assert(INT8_MIN == -128, "INT8_MIN == -128"); + static_assert(INT16_MIN == -32768, "INT16_MIN == -32768"); + static_assert(INT32_MIN == -2147483648U, "INT32_MIN == -2147483648"); + static_assert(INT64_MIN == -9223372036854775808ULL, "INT64_MIN == -9223372036854775808LL"); + + // INTN_MAX + static_assert(INT8_MAX == 127, "INT8_MAX == 127"); + static_assert(INT16_MAX == 32767, "INT16_MAX == 32767"); + static_assert(INT32_MAX == 2147483647, "INT32_MAX == 2147483647"); + static_assert(INT64_MAX == 9223372036854775807LL, "INT64_MAX == 9223372036854775807LL"); + + // UINTN_MAX + static_assert(UINT8_MAX == 255, "UINT8_MAX == 255"); + static_assert(UINT16_MAX == 65535, "UINT16_MAX == 65535"); + static_assert(UINT32_MAX == 4294967295U, "UINT32_MAX == 4294967295"); + static_assert(UINT64_MAX == 18446744073709551615ULL, "UINT64_MAX == 18446744073709551615ULL"); + + // INT_FASTN_MIN + static_assert(INT_FAST8_MIN <= -128, "INT_FAST8_MIN <= -128"); + static_assert(INT_FAST16_MIN <= -32768, "INT_FAST16_MIN <= -32768"); + static_assert(INT_FAST32_MIN <= -2147483648U, "INT_FAST32_MIN <= -2147483648"); + static_assert(INT_FAST64_MIN <= -9223372036854775808ULL, "INT_FAST64_MIN <= -9223372036854775808LL"); + + // INT_FASTN_MAX + static_assert(INT_FAST8_MAX >= 127, "INT_FAST8_MAX >= 127"); + static_assert(INT_FAST16_MAX >= 32767, "INT_FAST16_MAX >= 32767"); + static_assert(INT_FAST32_MAX >= 2147483647, "INT_FAST32_MAX >= 2147483647"); + static_assert(INT_FAST64_MAX >= 9223372036854775807LL, "INT_FAST64_MAX >= 9223372036854775807LL"); + + // UINT_FASTN_MAX + static_assert(UINT_FAST8_MAX >= 255, "UINT_FAST8_MAX >= 255"); + static_assert(UINT_FAST16_MAX >= 65535, "UINT_FAST16_MAX >= 65535"); + static_assert(UINT_FAST32_MAX >= 4294967295U, "UINT_FAST32_MAX >= 4294967295"); + static_assert(UINT_FAST64_MAX >= 18446744073709551615ULL, "UINT_FAST64_MAX >= 18446744073709551615ULL"); + + // INTPTR_MIN + assert(INTPTR_MIN == std::numeric_limits<std::intptr_t>::min()); + + // INTPTR_MAX + assert(INTPTR_MAX == std::numeric_limits<std::intptr_t>::max()); + + // UINTPTR_MAX + assert(UINTPTR_MAX == std::numeric_limits<std::uintptr_t>::max()); + + // INTMAX_MIN + assert(INTMAX_MIN == std::numeric_limits<std::intmax_t>::min()); + + // INTMAX_MAX + assert(INTMAX_MAX == std::numeric_limits<std::intmax_t>::max()); + + // UINTMAX_MAX + assert(UINTMAX_MAX == std::numeric_limits<std::uintmax_t>::max()); + + // PTRDIFF_MIN + assert(PTRDIFF_MIN == std::numeric_limits<std::ptrdiff_t>::min()); + + // PTRDIFF_MAX + assert(PTRDIFF_MAX == std::numeric_limits<std::ptrdiff_t>::max()); + + // SIG_ATOMIC_MIN + assert(SIG_ATOMIC_MIN == std::numeric_limits<std::sig_atomic_t>::min()); + + // SIG_ATOMIC_MAX + assert(SIG_ATOMIC_MAX == std::numeric_limits<std::sig_atomic_t>::max()); + + // SIZE_MAX + assert(SIZE_MAX == std::numeric_limits<std::size_t>::max()); + + // WCHAR_MIN + assert(WCHAR_MIN == std::numeric_limits<wchar_t>::min()); + + // WCHAR_MAX + assert(WCHAR_MAX == std::numeric_limits<wchar_t>::max()); + + // WINT_MIN + assert(WINT_MIN == std::numeric_limits<std::wint_t>::min()); + + // WINT_MAX + assert(WINT_MAX == std::numeric_limits<std::wint_t>::max()); + +#ifndef INT8_C +#error INT8_C not defined +#endif + +#ifndef INT16_C +#error INT16_C not defined +#endif + +#ifndef INT32_C +#error INT32_C not defined +#endif + +#ifndef INT64_C +#error INT64_C not defined +#endif + +#ifndef UINT8_C +#error UINT8_C not defined +#endif + +#ifndef UINT16_C +#error UINT16_C not defined +#endif + +#ifndef UINT32_C +#error UINT32_C not defined +#endif + +#ifndef UINT64_C +#error UINT64_C not defined +#endif + +#ifndef INTMAX_C +#error INTMAX_C not defined +#endif + +#ifndef UINTMAX_C +#error UINTMAX_C not defined +#endif +} diff --git a/libcxx/test/language.support/cstdint/version.pass.cpp b/libcxx/test/language.support/cstdint/version.pass.cpp new file mode 100644 index 00000000000..d8421704dc2 --- /dev/null +++ b/libcxx/test/language.support/cstdint/version.pass.cpp @@ -0,0 +1,20 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <cstdint> + +#include <cstdint> + +#ifndef _LIBCPP_VERSION +#error _LIBCPP_VERSION not defined +#endif + +int main() +{ +} diff --git a/libcxx/test/language.support/nothing_to_do.pass.cpp b/libcxx/test/language.support/nothing_to_do.pass.cpp new file mode 100644 index 00000000000..fa4d462f18d --- /dev/null +++ b/libcxx/test/language.support/nothing_to_do.pass.cpp @@ -0,0 +1,12 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +int main() +{ +} diff --git a/libcxx/test/language.support/support.dynamic/alloc.errors/bad.alloc/bad_alloc.pass.cpp b/libcxx/test/language.support/support.dynamic/alloc.errors/bad.alloc/bad_alloc.pass.cpp new file mode 100644 index 00000000000..7ca8b800dd9 --- /dev/null +++ b/libcxx/test/language.support/support.dynamic/alloc.errors/bad.alloc/bad_alloc.pass.cpp @@ -0,0 +1,27 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// test bad_alloc + +#include <new> +#include <type_traits> +#include <cassert> + +int main() +{ + static_assert((std::is_base_of<std::exception, std::bad_alloc>::value), + "std::is_base_of<std::exception, std::bad_alloc>::value"); + static_assert(std::is_polymorphic<std::bad_alloc>::value, + "std::is_polymorphic<std::bad_alloc>::value"); + std::bad_alloc b; + std::bad_alloc b2 = b; + b2 = b; + const char* w = b2.what(); + assert(w); +} diff --git a/libcxx/test/language.support/support.dynamic/alloc.errors/new.badlength/bad_array_new_length.pass.cpp b/libcxx/test/language.support/support.dynamic/alloc.errors/new.badlength/bad_array_new_length.pass.cpp new file mode 100644 index 00000000000..bc4a6cdb4a2 --- /dev/null +++ b/libcxx/test/language.support/support.dynamic/alloc.errors/new.badlength/bad_array_new_length.pass.cpp @@ -0,0 +1,27 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// test bad_array_new_length + +#include <new> +#include <type_traits> +#include <cassert> + +int main() +{ + static_assert((std::is_base_of<std::bad_alloc, std::bad_array_new_length>::value), + "std::is_base_of<std::bad_alloc, std::bad_array_new_length>::value"); + static_assert(std::is_polymorphic<std::bad_array_new_length>::value, + "std::is_polymorphic<std::bad_array_new_length>::value"); + std::bad_array_new_length b; + std::bad_array_new_length b2 = b; + b2 = b; + const char* w = b2.what(); + assert(w); +} diff --git a/libcxx/test/language.support/support.dynamic/alloc.errors/new.handler/new_handler.pass.cpp b/libcxx/test/language.support/support.dynamic/alloc.errors/new.handler/new_handler.pass.cpp new file mode 100644 index 00000000000..82ea243597d --- /dev/null +++ b/libcxx/test/language.support/support.dynamic/alloc.errors/new.handler/new_handler.pass.cpp @@ -0,0 +1,19 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// test new_handler + +#include <new> + +void f() {} + +int main() +{ + std::new_handler p = f; +} diff --git a/libcxx/test/language.support/support.dynamic/alloc.errors/nothing_to_do.pass.cpp b/libcxx/test/language.support/support.dynamic/alloc.errors/nothing_to_do.pass.cpp new file mode 100644 index 00000000000..fa4d462f18d --- /dev/null +++ b/libcxx/test/language.support/support.dynamic/alloc.errors/nothing_to_do.pass.cpp @@ -0,0 +1,12 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +int main() +{ +} diff --git a/libcxx/test/language.support/support.dynamic/alloc.errors/set.new.handler/set_new_handler.pass.cpp b/libcxx/test/language.support/support.dynamic/alloc.errors/set.new.handler/set_new_handler.pass.cpp new file mode 100644 index 00000000000..6b7949d4f98 --- /dev/null +++ b/libcxx/test/language.support/support.dynamic/alloc.errors/set.new.handler/set_new_handler.pass.cpp @@ -0,0 +1,22 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// test set_new_handler + +#include <new> +#include <cassert> + +void f1() {} +void f2() {} + +int main() +{ + assert(std::set_new_handler(f1) == 0); + assert(std::set_new_handler(f2) == f1); +} diff --git a/libcxx/test/language.support/support.dynamic/new.delete/new.delete.array/new_array.pass.cpp b/libcxx/test/language.support/support.dynamic/new.delete/new.delete.array/new_array.pass.cpp new file mode 100644 index 00000000000..639607345f4 --- /dev/null +++ b/libcxx/test/language.support/support.dynamic/new.delete/new.delete.array/new_array.pass.cpp @@ -0,0 +1,54 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + + // test operator new[] + +#include <new> +#include <cstddef> +#include <cassert> +#include <limits> + +int new_handler_called = 0; + +void new_handler() +{ + ++new_handler_called; + std::set_new_handler(0); +} + +int A_constructed = 0; + +struct A +{ + A() {++A_constructed;} + ~A() {--A_constructed;} +}; + +int main() +{ + std::set_new_handler(new_handler); + try + { + void* vp = operator new[] (std::numeric_limits<std::size_t>::max()); + assert(false); + } + catch (std::bad_alloc&) + { + assert(new_handler_called == 1); + } + catch (...) + { + assert(false); + } + A* ap = new A[3]; + assert(ap); + assert(A_constructed == 3); + delete [] ap; + assert(A_constructed == 0); +} diff --git a/libcxx/test/language.support/support.dynamic/new.delete/new.delete.array/new_array_nothrow.pass.cpp b/libcxx/test/language.support/support.dynamic/new.delete/new.delete.array/new_array_nothrow.pass.cpp new file mode 100644 index 00000000000..182de18706a --- /dev/null +++ b/libcxx/test/language.support/support.dynamic/new.delete/new.delete.array/new_array_nothrow.pass.cpp @@ -0,0 +1,51 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + + // test operator new [] (nothrow) + +#include <new> +#include <cstddef> +#include <cassert> +#include <limits> + +int new_handler_called = 0; + +void new_handler() +{ + ++new_handler_called; + std::set_new_handler(0); +} + +int A_constructed = 0; + +struct A +{ + A() {++A_constructed;} + ~A() {--A_constructed;} +}; + +int main() +{ + std::set_new_handler(new_handler); + try + { + void* vp = operator new [] (std::numeric_limits<std::size_t>::max(), std::nothrow); + assert(new_handler_called == 1); + assert(vp == 0); + } + catch (...) + { + assert(false); + } + A* ap = new(std::nothrow) A[3]; + assert(ap); + assert(A_constructed == 3); + delete [] ap; + assert(A_constructed == 0); +} diff --git a/libcxx/test/language.support/support.dynamic/new.delete/new.delete.array/new_array_nothrow_replace.pass.cpp b/libcxx/test/language.support/support.dynamic/new.delete/new.delete.array/new_array_nothrow_replace.pass.cpp new file mode 100644 index 00000000000..d06516c1fa6 --- /dev/null +++ b/libcxx/test/language.support/support.dynamic/new.delete/new.delete.array/new_array_nothrow_replace.pass.cpp @@ -0,0 +1,49 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + + // test operator new [] nothrow by replacing only operator new + +#include <new> +#include <cstddef> +#include <cstdlib> +#include <cassert> +#include <limits> + +int new_called = 0; + +void* operator new(std::size_t s) throw(std::bad_alloc) +{ + ++new_called; + return std::malloc(s); +} + +void operator delete(void* p) throw() +{ + --new_called; + std::free(p); +} + +int A_constructed = 0; + +struct A +{ + A() {++A_constructed;} + ~A() {--A_constructed;} +}; + +int main() +{ + A* ap = new (std::nothrow) A[3]; + assert(ap); + assert(A_constructed == 3); + assert(new_called); + delete [] ap; + assert(A_constructed == 0); + assert(!new_called); +} diff --git a/libcxx/test/language.support/support.dynamic/new.delete/new.delete.array/new_array_replace.pass.cpp b/libcxx/test/language.support/support.dynamic/new.delete/new.delete.array/new_array_replace.pass.cpp new file mode 100644 index 00000000000..f673e05d0fb --- /dev/null +++ b/libcxx/test/language.support/support.dynamic/new.delete/new.delete.array/new_array_replace.pass.cpp @@ -0,0 +1,49 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + + // test operator new[] replacement by replacing only operator new + +#include <new> +#include <cstddef> +#include <cstdlib> +#include <cassert> +#include <limits> + +int new_called = 0; + +void* operator new(std::size_t s) throw(std::bad_alloc) +{ + ++new_called; + return std::malloc(s); +} + +void operator delete(void* p) throw() +{ + --new_called; + std::free(p); +} + +int A_constructed = 0; + +struct A +{ + A() {++A_constructed;} + ~A() {--A_constructed;} +}; + +int main() +{ + A* ap = new A[3]; + assert(ap); + assert(A_constructed == 3); + assert(new_called == 1); + delete [] ap; + assert(A_constructed == 0); + assert(new_called == 0); +} diff --git a/libcxx/test/language.support/support.dynamic/new.delete/new.delete.dataraces/not_testable.pass.cpp b/libcxx/test/language.support/support.dynamic/new.delete/new.delete.dataraces/not_testable.pass.cpp new file mode 100644 index 00000000000..fa4d462f18d --- /dev/null +++ b/libcxx/test/language.support/support.dynamic/new.delete/new.delete.dataraces/not_testable.pass.cpp @@ -0,0 +1,12 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +int main() +{ +} diff --git a/libcxx/test/language.support/support.dynamic/new.delete/new.delete.placement/new.pass.cpp b/libcxx/test/language.support/support.dynamic/new.delete/new.delete.placement/new.pass.cpp new file mode 100644 index 00000000000..075bd39972a --- /dev/null +++ b/libcxx/test/language.support/support.dynamic/new.delete/new.delete.placement/new.pass.cpp @@ -0,0 +1,30 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// test placement new + +#include <new> +#include <cassert> + +int A_constructed = 0; + +struct A +{ + A() {++A_constructed;} + ~A() {--A_constructed;} +}; + +int main() +{ + char buf[sizeof(A)]; + + A* ap = new(buf) A; + assert((char*)ap == buf); + assert(A_constructed == 1); +} diff --git a/libcxx/test/language.support/support.dynamic/new.delete/new.delete.placement/new_array.pass.cpp b/libcxx/test/language.support/support.dynamic/new.delete/new.delete.placement/new_array.pass.cpp new file mode 100644 index 00000000000..0179852c00e --- /dev/null +++ b/libcxx/test/language.support/support.dynamic/new.delete/new.delete.placement/new_array.pass.cpp @@ -0,0 +1,30 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// test placement new array + +#include <new> +#include <cassert> + +int A_constructed = 0; + +struct A +{ + A() {++A_constructed;} + ~A() {--A_constructed;} +}; + +int main() +{ + char buf[3*sizeof(A)]; + + A* ap = new(buf) A[3]; + assert((char*)ap == buf); + assert(A_constructed == 3); +} diff --git a/libcxx/test/language.support/support.dynamic/new.delete/new.delete.single/new.pass.cpp b/libcxx/test/language.support/support.dynamic/new.delete/new.delete.single/new.pass.cpp new file mode 100644 index 00000000000..54ac1196b74 --- /dev/null +++ b/libcxx/test/language.support/support.dynamic/new.delete/new.delete.single/new.pass.cpp @@ -0,0 +1,54 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + + // test operator new + +#include <new> +#include <cstddef> +#include <cassert> +#include <limits> + +int new_handler_called = 0; + +void new_handler() +{ + ++new_handler_called; + std::set_new_handler(0); +} + +bool A_constructed = false; + +struct A +{ + A() {A_constructed = true;} + ~A() {A_constructed = false;} +}; + +int main() +{ + std::set_new_handler(new_handler); + try + { + void* vp = operator new (std::numeric_limits<std::size_t>::max()); + assert(false); + } + catch (std::bad_alloc&) + { + assert(new_handler_called == 1); + } + catch (...) + { + assert(false); + } + A* ap = new A; + assert(ap); + assert(A_constructed); + delete ap; + assert(!A_constructed); +} diff --git a/libcxx/test/language.support/support.dynamic/new.delete/new.delete.single/new_nothrow.pass.cpp b/libcxx/test/language.support/support.dynamic/new.delete/new.delete.single/new_nothrow.pass.cpp new file mode 100644 index 00000000000..edbd80268e9 --- /dev/null +++ b/libcxx/test/language.support/support.dynamic/new.delete/new.delete.single/new_nothrow.pass.cpp @@ -0,0 +1,51 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + + // test operator new (nothrow) + +#include <new> +#include <cstddef> +#include <cassert> +#include <limits> + +int new_handler_called = 0; + +void new_handler() +{ + ++new_handler_called; + std::set_new_handler(0); +} + +bool A_constructed = false; + +struct A +{ + A() {A_constructed = true;} + ~A() {A_constructed = false;} +}; + +int main() +{ + std::set_new_handler(new_handler); + try + { + void* vp = operator new (std::numeric_limits<std::size_t>::max(), std::nothrow); + assert(new_handler_called == 1); + assert(vp == 0); + } + catch (...) + { + assert(false); + } + A* ap = new(std::nothrow) A; + assert(ap); + assert(A_constructed); + delete ap; + assert(!A_constructed); +} diff --git a/libcxx/test/language.support/support.dynamic/new.delete/new.delete.single/new_nothrow_replace.pass.cpp b/libcxx/test/language.support/support.dynamic/new.delete/new.delete.single/new_nothrow_replace.pass.cpp new file mode 100644 index 00000000000..4ee05d5a27c --- /dev/null +++ b/libcxx/test/language.support/support.dynamic/new.delete/new.delete.single/new_nothrow_replace.pass.cpp @@ -0,0 +1,49 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + + // test operator new nothrow by replacing only operator new + +#include <new> +#include <cstddef> +#include <cstdlib> +#include <cassert> +#include <limits> + +int new_called = 0; + +void* operator new(std::size_t s) throw(std::bad_alloc) +{ + ++new_called; + return std::malloc(s); +} + +void operator delete(void* p) throw() +{ + --new_called; + std::free(p); +} + +bool A_constructed = false; + +struct A +{ + A() {A_constructed = true;} + ~A() {A_constructed = false;} +}; + +int main() +{ + A* ap = new (std::nothrow) A; + assert(ap); + assert(A_constructed); + assert(new_called); + delete ap; + assert(!A_constructed); + assert(!new_called); +} diff --git a/libcxx/test/language.support/support.dynamic/new.delete/new.delete.single/new_replace.pass.cpp b/libcxx/test/language.support/support.dynamic/new.delete/new.delete.single/new_replace.pass.cpp new file mode 100644 index 00000000000..1d35f200f63 --- /dev/null +++ b/libcxx/test/language.support/support.dynamic/new.delete/new.delete.single/new_replace.pass.cpp @@ -0,0 +1,49 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + + // test operator new replacement + +#include <new> +#include <cstddef> +#include <cstdlib> +#include <cassert> +#include <limits> + +int new_called = 0; + +void* operator new(std::size_t s) throw(std::bad_alloc) +{ + ++new_called; + return std::malloc(s); +} + +void operator delete(void* p) throw() +{ + --new_called; + std::free(p); +} + +bool A_constructed = false; + +struct A +{ + A() {A_constructed = true;} + ~A() {A_constructed = false;} +}; + +int main() +{ + A* ap = new A; + assert(ap); + assert(A_constructed); + assert(new_called); + delete ap; + assert(!A_constructed); + assert(!new_called); +} diff --git a/libcxx/test/language.support/support.dynamic/new.delete/nothing_to_do.pass.cpp b/libcxx/test/language.support/support.dynamic/new.delete/nothing_to_do.pass.cpp new file mode 100644 index 00000000000..fa4d462f18d --- /dev/null +++ b/libcxx/test/language.support/support.dynamic/new.delete/nothing_to_do.pass.cpp @@ -0,0 +1,12 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +int main() +{ +} diff --git a/libcxx/test/language.support/support.dynamic/version.pass.cpp b/libcxx/test/language.support/support.dynamic/version.pass.cpp new file mode 100644 index 00000000000..32273803572 --- /dev/null +++ b/libcxx/test/language.support/support.dynamic/version.pass.cpp @@ -0,0 +1,20 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <new> + +#include <new> + +#ifndef _LIBCPP_VERSION +#error _LIBCPP_VERSION not defined +#endif + +int main() +{ +} diff --git a/libcxx/test/language.support/support.exception/exception.terminate/nothing_to_do.pass.cpp b/libcxx/test/language.support/support.exception/exception.terminate/nothing_to_do.pass.cpp new file mode 100644 index 00000000000..fa4d462f18d --- /dev/null +++ b/libcxx/test/language.support/support.exception/exception.terminate/nothing_to_do.pass.cpp @@ -0,0 +1,12 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +int main() +{ +} diff --git a/libcxx/test/language.support/support.exception/exception.terminate/set.terminate/set_terminate.pass.cpp b/libcxx/test/language.support/support.exception/exception.terminate/set.terminate/set_terminate.pass.cpp new file mode 100644 index 00000000000..21de6f285c0 --- /dev/null +++ b/libcxx/test/language.support/support.exception/exception.terminate/set.terminate/set_terminate.pass.cpp @@ -0,0 +1,23 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// test set_terminate + +#include <exception> +#include <cstdlib> +#include <cassert> + +void f1() {} +void f2() {} + +int main() +{ + std::set_terminate(f1); + assert(std::set_terminate(f2) == f1); +} diff --git a/libcxx/test/language.support/support.exception/exception.terminate/terminate.handler/terminate_handler.pass.cpp b/libcxx/test/language.support/support.exception/exception.terminate/terminate.handler/terminate_handler.pass.cpp new file mode 100644 index 00000000000..0a3a4573319 --- /dev/null +++ b/libcxx/test/language.support/support.exception/exception.terminate/terminate.handler/terminate_handler.pass.cpp @@ -0,0 +1,19 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// test terminate_handler + +#include <exception> + +void f() {} + +int main() +{ + std::terminate_handler p = f; +} diff --git a/libcxx/test/language.support/support.exception/exception.terminate/terminate/terminate.pass.cpp b/libcxx/test/language.support/support.exception/exception.terminate/terminate/terminate.pass.cpp new file mode 100644 index 00000000000..b34051d9ed6 --- /dev/null +++ b/libcxx/test/language.support/support.exception/exception.terminate/terminate/terminate.pass.cpp @@ -0,0 +1,26 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// test terminate + +#include <exception> +#include <cstdlib> +#include <cassert> + +void f1() +{ + std::exit(0); +} + +int main() +{ + std::set_terminate(f1); + std::terminate(); + assert(false); +} diff --git a/libcxx/test/language.support/support.exception/exception.unexpected/bad.exception/bad_exception.pass.cpp b/libcxx/test/language.support/support.exception/exception.unexpected/bad.exception/bad_exception.pass.cpp new file mode 100644 index 00000000000..9f32dac7e75 --- /dev/null +++ b/libcxx/test/language.support/support.exception/exception.unexpected/bad.exception/bad_exception.pass.cpp @@ -0,0 +1,27 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// test bad_exception + +#include <exception> +#include <type_traits> +#include <cassert> + +int main() +{ + static_assert((std::is_base_of<std::exception, std::bad_exception>::value), + "std::is_base_of<std::exception, std::bad_exception>::value"); + static_assert(std::is_polymorphic<std::bad_exception>::value, + "std::is_polymorphic<std::bad_exception>::value"); + std::bad_exception b; + std::bad_exception b2 = b; + b2 = b; + const char* w = b2.what(); + assert(w); +} diff --git a/libcxx/test/language.support/support.exception/exception.unexpected/nothing_to_do.pass.cpp b/libcxx/test/language.support/support.exception/exception.unexpected/nothing_to_do.pass.cpp new file mode 100644 index 00000000000..fa4d462f18d --- /dev/null +++ b/libcxx/test/language.support/support.exception/exception.unexpected/nothing_to_do.pass.cpp @@ -0,0 +1,12 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +int main() +{ +} diff --git a/libcxx/test/language.support/support.exception/exception.unexpected/set.unexpected/set_unexpected.pass.cpp b/libcxx/test/language.support/support.exception/exception.unexpected/set.unexpected/set_unexpected.pass.cpp new file mode 100644 index 00000000000..6f52ab772aa --- /dev/null +++ b/libcxx/test/language.support/support.exception/exception.unexpected/set.unexpected/set_unexpected.pass.cpp @@ -0,0 +1,22 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// test set_unexpected + +#include <exception> +#include <cassert> + +void f1() {} +void f2() {} + +int main() +{ + assert(std::set_unexpected(f1) == std::terminate); + assert(std::set_unexpected(f2) == f1); +} diff --git a/libcxx/test/language.support/support.exception/exception.unexpected/unexpected.handler/unexpected_handler.pass.cpp b/libcxx/test/language.support/support.exception/exception.unexpected/unexpected.handler/unexpected_handler.pass.cpp new file mode 100644 index 00000000000..dbb56069d48 --- /dev/null +++ b/libcxx/test/language.support/support.exception/exception.unexpected/unexpected.handler/unexpected_handler.pass.cpp @@ -0,0 +1,19 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// test unexpected_handler + +#include <exception> + +void f() {} + +int main() +{ + std::unexpected_handler p = f; +} diff --git a/libcxx/test/language.support/support.exception/exception.unexpected/unexpected/unexpected.pass.cpp b/libcxx/test/language.support/support.exception/exception.unexpected/unexpected/unexpected.pass.cpp new file mode 100644 index 00000000000..0f441e2b6e7 --- /dev/null +++ b/libcxx/test/language.support/support.exception/exception.unexpected/unexpected/unexpected.pass.cpp @@ -0,0 +1,26 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// test unexpected + +#include <exception> +#include <cstdlib> +#include <cassert> + +void f1() +{ + std::exit(0); +} + +int main() +{ + std::set_unexpected(f1); + std::unexpected(); + assert(false); +} diff --git a/libcxx/test/language.support/support.exception/exception/exception.pass.cpp b/libcxx/test/language.support/support.exception/exception/exception.pass.cpp new file mode 100644 index 00000000000..d3ad7e4b280 --- /dev/null +++ b/libcxx/test/language.support/support.exception/exception/exception.pass.cpp @@ -0,0 +1,25 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// test exception + +#include <exception> +#include <type_traits> +#include <cassert> + +int main() +{ + static_assert(std::is_polymorphic<std::exception>::value, + "std::is_polymorphic<std::exception>::value"); + std::exception b; + std::exception b2 = b; + b2 = b; + const char* w = b2.what(); + assert(w); +} diff --git a/libcxx/test/language.support/support.exception/propagation/current_exception.pass.cpp b/libcxx/test/language.support/support.exception/propagation/current_exception.pass.cpp new file mode 100644 index 00000000000..95ba458df49 --- /dev/null +++ b/libcxx/test/language.support/support.exception/propagation/current_exception.pass.cpp @@ -0,0 +1,269 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <exception> + +// exception_ptr current_exception(); + +#include <exception> +#include <cassert> + +struct A +{ + static int constructed; + + A() {++constructed;} + ~A() {--constructed;} + A(const A&) {++constructed;} +}; + +int A::constructed = 0; + +int main() +{ + { + std::exception_ptr p = std::current_exception(); + assert(p == nullptr); + } + { + try + { + assert(A::constructed == 0); + throw A(); + assert(false); + } + catch (...) + { + assert(A::constructed == 1); + } + assert(A::constructed == 0); + } + assert(A::constructed == 0); + { + std::exception_ptr p2; + try + { + assert(A::constructed == 0); + throw A(); + assert(false); + } + catch (...) + { + std::exception_ptr p = std::current_exception(); + assert(A::constructed == 1); + assert(p != nullptr); + p2 = std::current_exception(); + assert(A::constructed == 1); + assert(p == p2); + } + assert(A::constructed == 1); + } + assert(A::constructed == 0); + { + std::exception_ptr p2; + try + { + assert(A::constructed == 0); + throw A(); + assert(false); + } + catch (A& a) + { + std::exception_ptr p = std::current_exception(); + assert(A::constructed == 1); + assert(p != nullptr); + p2 = std::current_exception(); + assert(A::constructed == 1); + assert(p == p2); + } + assert(A::constructed == 1); + } + assert(A::constructed == 0); + { + std::exception_ptr p2; + try + { + assert(A::constructed == 0); + throw A(); + assert(false); + } + catch (A a) + { + std::exception_ptr p = std::current_exception(); + assert(A::constructed == 2); + assert(p != nullptr); + p2 = std::current_exception(); + assert(A::constructed == 2); + assert(p == p2); + } + assert(A::constructed == 1); + } + assert(A::constructed == 0); + { + try + { + assert(A::constructed == 0); + throw A(); + assert(false); + } + catch (...) + { + assert(A::constructed == 1); + try + { + assert(A::constructed == 1); + throw; + assert(false); + } + catch (...) + { + assert(A::constructed == 1); + } + assert(A::constructed == 1); + } + assert(A::constructed == 0); + } + assert(A::constructed == 0); + { + try + { + assert(A::constructed == 0); + throw A(); + assert(false); + } + catch (...) + { + assert(A::constructed == 1); + try + { + std::exception_ptr p = std::current_exception(); + assert(A::constructed == 1); + assert(p != nullptr); + throw; + assert(false); + } + catch (...) + { + assert(A::constructed == 1); + } + assert(A::constructed == 1); + } + assert(A::constructed == 0); + } + assert(A::constructed == 0); + { + try + { + assert(A::constructed == 0); + throw A(); + assert(false); + } + catch (...) + { + assert(A::constructed == 1); + try + { + assert(A::constructed == 1); + throw; + assert(false); + } + catch (...) + { + std::exception_ptr p = std::current_exception(); + assert(A::constructed == 1); + assert(p != nullptr); + } + assert(A::constructed == 1); + } + assert(A::constructed == 0); + } + assert(A::constructed == 0); + { + try + { + assert(A::constructed == 0); + throw A(); + assert(false); + } + catch (...) + { + assert(A::constructed == 1); + try + { + assert(A::constructed == 1); + throw; + assert(false); + } + catch (...) + { + assert(A::constructed == 1); + } + std::exception_ptr p = std::current_exception(); + assert(A::constructed == 1); + assert(p != nullptr); + } + assert(A::constructed == 0); + } + assert(A::constructed == 0); + { + try + { + assert(A::constructed == 0); + throw A(); + assert(false); + } + catch (...) + { + assert(A::constructed == 1); + try + { + assert(A::constructed == 1); + throw; + assert(false); + } + catch (...) + { + assert(A::constructed == 1); + } + assert(A::constructed == 1); + } + std::exception_ptr p = std::current_exception(); + assert(A::constructed == 0); + assert(p == nullptr); + } + assert(A::constructed == 0); + { + std::exception_ptr p; + try + { + assert(A::constructed == 0); + throw A(); + assert(false); + } + catch (...) + { + assert(A::constructed == 1); + try + { + assert(A::constructed == 1); + throw; + assert(false); + } + catch (...) + { + p = std::current_exception(); + assert(A::constructed == 1); + } + assert(A::constructed == 1); + } + assert(A::constructed == 1); + assert(p != nullptr); + } + assert(A::constructed == 0); +} diff --git a/libcxx/test/language.support/support.exception/propagation/exception_ptr.pass.cpp b/libcxx/test/language.support/support.exception/propagation/exception_ptr.pass.cpp new file mode 100644 index 00000000000..6c017688bce --- /dev/null +++ b/libcxx/test/language.support/support.exception/propagation/exception_ptr.pass.cpp @@ -0,0 +1,34 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <exception> + +// typedef unspecified exception_ptr; + +// exception_ptr shall satisfy the requirements of NullablePointer. + +#include <exception> +#include <cassert> + +int main() +{ + std::exception_ptr p; + assert(p == nullptr); + std::exception_ptr p2 = p; + assert(nullptr == p); + assert(!p); + assert(p2 == p); + p2 = p; + assert(p2 == p); + assert(p2 == nullptr); + std::exception_ptr p3 = nullptr; + assert(p3 == nullptr); + p3 = nullptr; + assert(p3 == nullptr); +} diff --git a/libcxx/test/language.support/support.exception/propagation/make_exception_ptr.pass.cpp b/libcxx/test/language.support/support.exception/propagation/make_exception_ptr.pass.cpp new file mode 100644 index 00000000000..794199fa567 --- /dev/null +++ b/libcxx/test/language.support/support.exception/propagation/make_exception_ptr.pass.cpp @@ -0,0 +1,49 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <exception> + +// template<class E> exception_ptr make_exception_ptr(E e); + +#include <exception> +#include <cassert> + +struct A +{ + static int constructed; + int data_; + + A(int data = 0) : data_(data) {++constructed;} + ~A() {--constructed;} + A(const A& a) : data_(a.data_) {++constructed;} +}; + +int A::constructed = 0; + +int main() +{ + { + std::exception_ptr p = std::make_exception_ptr(A(5)); + try + { + std::rethrow_exception(p); + assert(false); + } + catch (const A& a) + { + assert(A::constructed == 1); + assert(p != nullptr); + p = nullptr; + assert(p == nullptr); + assert(a.data_ == 5); + assert(A::constructed == 1); + } + assert(A::constructed == 0); + } +} diff --git a/libcxx/test/language.support/support.exception/propagation/rethrow_exception.pass.cpp b/libcxx/test/language.support/support.exception/propagation/rethrow_exception.pass.cpp new file mode 100644 index 00000000000..6cb19f709fa --- /dev/null +++ b/libcxx/test/language.support/support.exception/propagation/rethrow_exception.pass.cpp @@ -0,0 +1,57 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <exception> + +// void rethrow_exception [[noreturn]] (exception_ptr p); + +#include <exception> +#include <cassert> + +struct A +{ + static int constructed; + int data_; + + A(int data = 0) : data_(data) {++constructed;} + ~A() {--constructed;} + A(const A& a) : data_(a.data_) {++constructed;} +}; + +int A::constructed = 0; + +int main() +{ + { + std::exception_ptr p; + try + { + throw A(3); + } + catch (...) + { + p = std::current_exception(); + } + try + { + std::rethrow_exception(p); + assert(false); + } + catch (const A& a) + { + assert(A::constructed == 1); + assert(p != nullptr); + p = nullptr; + assert(p == nullptr); + assert(a.data_ == 3); + assert(A::constructed == 1); + } + assert(A::constructed == 0); + } +} diff --git a/libcxx/test/language.support/support.exception/uncaught/uncaught_exception.pass.cpp b/libcxx/test/language.support/support.exception/uncaught/uncaught_exception.pass.cpp new file mode 100644 index 00000000000..33ee8770464 --- /dev/null +++ b/libcxx/test/language.support/support.exception/uncaught/uncaught_exception.pass.cpp @@ -0,0 +1,36 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// test uncaught_exception + +#include <exception> +#include <cassert> + +struct A +{ + ~A() + { + assert(std::uncaught_exception()); + } +}; + +int main() +{ + try + { + A a; + assert(!std::uncaught_exception()); + throw 1; + } + catch (...) + { + assert(!std::uncaught_exception()); + } + assert(!std::uncaught_exception()); +} diff --git a/libcxx/test/language.support/support.exception/version.pass.cpp b/libcxx/test/language.support/support.exception/version.pass.cpp new file mode 100644 index 00000000000..db3013e9f11 --- /dev/null +++ b/libcxx/test/language.support/support.exception/version.pass.cpp @@ -0,0 +1,20 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <exception> + +#include <exception> + +#ifndef _LIBCPP_VERSION +#error _LIBCPP_VERSION not defined +#endif + +int main() +{ +} diff --git a/libcxx/test/language.support/support.general/nothing_to_do.pass.cpp b/libcxx/test/language.support/support.general/nothing_to_do.pass.cpp new file mode 100644 index 00000000000..fa4d462f18d --- /dev/null +++ b/libcxx/test/language.support/support.general/nothing_to_do.pass.cpp @@ -0,0 +1,12 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +int main() +{ +} diff --git a/libcxx/test/language.support/support.initlist/support.initlist.access/access.pass.cpp b/libcxx/test/language.support/support.initlist/support.initlist.access/access.pass.cpp new file mode 100644 index 00000000000..169d125e283 --- /dev/null +++ b/libcxx/test/language.support/support.initlist/support.initlist.access/access.pass.cpp @@ -0,0 +1,38 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// template<class E> class initializer_list; + +// const E* begin() const; +// const E* end() const; +// size_t size() const; + +#include <initializer_list> +#include <cassert> + +struct A +{ + A(std::initializer_list<int> il) + { + const int* b = il.begin(); + const int* e = il.end(); + assert(il.size() == 3); + assert(e - b == il.size()); + assert(*b++ == 3); + assert(*b++ == 2); + assert(*b++ == 1); + } +}; + +int main() +{ +#ifdef _LIBCPP_MOVE + A test1 = {3, 2, 1}; +#endif +} diff --git a/libcxx/test/language.support/support.initlist/support.initlist.cons/default.pass.cpp b/libcxx/test/language.support/support.initlist/support.initlist.cons/default.pass.cpp new file mode 100644 index 00000000000..f5147b9d1a2 --- /dev/null +++ b/libcxx/test/language.support/support.initlist/support.initlist.cons/default.pass.cpp @@ -0,0 +1,23 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// template<class E> class initializer_list; + +// initializer_list(); + +#include <initializer_list> +#include <cassert> + +struct A {}; + +int main() +{ + std::initializer_list<A> il; + assert(il.size() == 0); +} diff --git a/libcxx/test/language.support/support.initlist/types.pass.cpp b/libcxx/test/language.support/support.initlist/types.pass.cpp new file mode 100644 index 00000000000..c7af06e2890 --- /dev/null +++ b/libcxx/test/language.support/support.initlist/types.pass.cpp @@ -0,0 +1,35 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// template<class E> +// class initializer_list +// { +// public: +// typedef E value_type; +// typedef const E& reference; +// typedef const E& const_reference; +// typedef size_t size_type; +// +// typedef const E* iterator; +// typedef const E* const_iterator; + +#include <initializer_list> +#include <type_traits> + +struct A {}; + +int main() +{ + static_assert((std::is_same<std::initializer_list<A>::value_type, A>::value), ""); + static_assert((std::is_same<std::initializer_list<A>::reference, const A&>::value), ""); + static_assert((std::is_same<std::initializer_list<A>::const_reference, const A&>::value), ""); + static_assert((std::is_same<std::initializer_list<A>::size_type, std::size_t>::value), ""); + static_assert((std::is_same<std::initializer_list<A>::iterator, const A*>::value), ""); + static_assert((std::is_same<std::initializer_list<A>::const_iterator, const A*>::value), ""); +} diff --git a/libcxx/test/language.support/support.initlist/version.pass.cpp b/libcxx/test/language.support/support.initlist/version.pass.cpp new file mode 100644 index 00000000000..bf36347f7c3 --- /dev/null +++ b/libcxx/test/language.support/support.initlist/version.pass.cpp @@ -0,0 +1,20 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <initializer_list> + +#include <initializer_list> + +#ifndef _LIBCPP_VERSION +#error _LIBCPP_VERSION not defined +#endif + +int main() +{ +} diff --git a/libcxx/test/language.support/support.limits/c.limits/cfloat.pass.cpp b/libcxx/test/language.support/support.limits/c.limits/cfloat.pass.cpp new file mode 100644 index 00000000000..8ec63374779 --- /dev/null +++ b/libcxx/test/language.support/support.limits/c.limits/cfloat.pass.cpp @@ -0,0 +1,140 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + + // test cfloat + +#include <cfloat> + +#ifndef FLT_ROUNDS +#error FLT_ROUNDS not defined +#endif + +#ifndef FLT_EVAL_METHOD +#error FLT_EVAL_METHOD not defined +#endif + +#ifndef FLT_RADIX +#error FLT_RADIX not defined +#endif + +#ifndef FLT_MANT_DIG +#error FLT_MANT_DIG not defined +#endif + +#ifndef DBL_MANT_DIG +#error DBL_MANT_DIG not defined +#endif + +#ifndef LDBL_MANT_DIG +#error LDBL_MANT_DIG not defined +#endif + +#ifndef DECIMAL_DIG +#error DECIMAL_DIG not defined +#endif + +#ifndef FLT_DIG +#error FLT_DIG not defined +#endif + +#ifndef DBL_DIG +#error DBL_DIG not defined +#endif + +#ifndef LDBL_DIG +#error LDBL_DIG not defined +#endif + +#ifndef FLT_MIN_EXP +#error FLT_MIN_EXP not defined +#endif + +#ifndef DBL_MIN_EXP +#error DBL_MIN_EXP not defined +#endif + +#ifndef LDBL_MIN_EXP +#error LDBL_MIN_EXP not defined +#endif + +#ifndef FLT_MIN_10_EXP +#error FLT_MIN_10_EXP not defined +#endif + +#ifndef DBL_MIN_10_EXP +#error DBL_MIN_10_EXP not defined +#endif + +#ifndef LDBL_MIN_10_EXP +#error LDBL_MIN_10_EXP not defined +#endif + +#ifndef FLT_MAX_EXP +#error FLT_MAX_EXP not defined +#endif + +#ifndef DBL_MAX_EXP +#error DBL_MAX_EXP not defined +#endif + +#ifndef LDBL_MAX_EXP +#error LDBL_MAX_EXP not defined +#endif + +#ifndef FLT_MAX_10_EXP +#error FLT_MAX_10_EXP not defined +#endif + +#ifndef DBL_MAX_10_EXP +#error DBL_MAX_10_EXP not defined +#endif + +#ifndef LDBL_MAX_10_EXP +#error LDBL_MAX_10_EXP not defined +#endif + +#ifndef FLT_MAX +#error FLT_MAX not defined +#endif + +#ifndef DBL_MAX +#error DBL_MAX not defined +#endif + +#ifndef LDBL_MAX +#error LDBL_MAX not defined +#endif + +#ifndef FLT_EPSILON +#error FLT_EPSILON not defined +#endif + +#ifndef DBL_EPSILON +#error DBL_EPSILON not defined +#endif + +#ifndef LDBL_EPSILON +#error LDBL_EPSILON not defined +#endif + +#ifndef FLT_MIN +#error FLT_MIN not defined +#endif + +#ifndef DBL_MIN +#error DBL_MIN not defined +#endif + +#ifndef LDBL_MIN +#error LDBL_MIN not defined +#endif + +int main() +{ +} diff --git a/libcxx/test/language.support/support.limits/c.limits/climits.pass.cpp b/libcxx/test/language.support/support.limits/c.limits/climits.pass.cpp new file mode 100644 index 00000000000..265f2603cc7 --- /dev/null +++ b/libcxx/test/language.support/support.limits/c.limits/climits.pass.cpp @@ -0,0 +1,92 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + + // test climits + +#include <climits> + +#ifndef CHAR_BIT +#error CHAR_BIT not defined +#endif + +#ifndef SCHAR_MIN +#error SCHAR_MIN not defined +#endif + +#ifndef SCHAR_MAX +#error SCHAR_MAX not defined +#endif + +#ifndef UCHAR_MAX +#error UCHAR_MAX not defined +#endif + +#ifndef CHAR_MIN +#error CHAR_MIN not defined +#endif + +#ifndef CHAR_MAX +#error CHAR_MAX not defined +#endif + +#ifndef MB_LEN_MAX +#error MB_LEN_MAX not defined +#endif + +#ifndef SHRT_MIN +#error SHRT_MIN not defined +#endif + +#ifndef SHRT_MAX +#error SHRT_MAX not defined +#endif + +#ifndef USHRT_MAX +#error USHRT_MAX not defined +#endif + +#ifndef INT_MIN +#error INT_MIN not defined +#endif + +#ifndef INT_MAX +#error INT_MAX not defined +#endif + +#ifndef UINT_MAX +#error UINT_MAX not defined +#endif + +#ifndef LONG_MIN +#error LONG_MIN not defined +#endif + +#ifndef LONG_MAX +#error LONG_MAX not defined +#endif + +#ifndef ULONG_MAX +#error ULONG_MAX not defined +#endif + +#ifndef LLONG_MIN +#error LLONG_MIN not defined +#endif + +#ifndef LLONG_MAX +#error LLONG_MAX not defined +#endif + +#ifndef ULLONG_MAX +#error ULLONG_MAX not defined +#endif + +int main() +{ +} diff --git a/libcxx/test/language.support/support.limits/c.limits/version_cfloat.pass.cpp b/libcxx/test/language.support/support.limits/c.limits/version_cfloat.pass.cpp new file mode 100644 index 00000000000..c399be5f825 --- /dev/null +++ b/libcxx/test/language.support/support.limits/c.limits/version_cfloat.pass.cpp @@ -0,0 +1,20 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <cfloat> + +#include <cfloat> + +#ifndef _LIBCPP_VERSION +#error _LIBCPP_VERSION not defined +#endif + +int main() +{ +} diff --git a/libcxx/test/language.support/support.limits/c.limits/version_climits.pass.cpp b/libcxx/test/language.support/support.limits/c.limits/version_climits.pass.cpp new file mode 100644 index 00000000000..3ac5ea2d14c --- /dev/null +++ b/libcxx/test/language.support/support.limits/c.limits/version_climits.pass.cpp @@ -0,0 +1,20 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <climits> + +#include <climits> + +#ifndef _LIBCPP_VERSION +#error _LIBCPP_VERSION not defined +#endif + +int main() +{ +} diff --git a/libcxx/test/language.support/support.limits/limits/denorm.style/check_values.pass.cpp b/libcxx/test/language.support/support.limits/limits/denorm.style/check_values.pass.cpp new file mode 100644 index 00000000000..029dfe17dc9 --- /dev/null +++ b/libcxx/test/language.support/support.limits/limits/denorm.style/check_values.pass.cpp @@ -0,0 +1,38 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// test numeric_limits + +// float_round_style + +#include <limits> + +typedef char one; +struct two {one _[2];}; + +one test(std::float_round_style); +two test(int); + +int main() +{ + static_assert(std::round_indeterminate == -1, + "std::round_indeterminate == -1"); + static_assert(std::round_toward_zero == 0, + "std::round_toward_zero == 0"); + static_assert(std::round_to_nearest == 1, + "std::round_to_nearest == 1"); + static_assert(std::round_toward_infinity == 2, + "std::round_toward_infinity == 2"); + static_assert(std::round_toward_neg_infinity == 3, + "std::round_toward_neg_infinity == 3"); + static_assert(sizeof(test(std::round_to_nearest)) == 1, + "sizeof(test(std::round_to_nearest)) == 1"); + static_assert(sizeof(test(1)) == 2, + "sizeof(test(1)) == 2"); +} diff --git a/libcxx/test/language.support/support.limits/limits/is_specialized.pass.cpp b/libcxx/test/language.support/support.limits/limits/is_specialized.pass.cpp new file mode 100644 index 00000000000..490289e182e --- /dev/null +++ b/libcxx/test/language.support/support.limits/limits/is_specialized.pass.cpp @@ -0,0 +1,67 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// test numeric_limits + +// Specializations shall be provided for each arithmetic type, both floating +// point and integer, including bool. The member is_specialized shall be +// true for all such specializations of numeric_limits. + +// Non-arithmetic standard types, such as complex<T> (26.3.2), shall not +// have specializations. + +// From [numeric.limits]: + +// The value of each member of a specialization of numeric_limits on a cv +// -qualified type cv T shall be equal to the value of the corresponding +// member of the specialization on the unqualified type T. + +// More convenient to test it here. + +#include <limits> +#include <complex> + +template <class T> +void test() +{ + static_assert(std::numeric_limits<T>::is_specialized, + "std::numeric_limits<T>::is_specialized"); + static_assert(std::numeric_limits<const T>::is_specialized, + "std::numeric_limits<const T>::is_specialized"); + static_assert(std::numeric_limits<volatile T>::is_specialized, + "std::numeric_limits<volatile T>::is_specialized"); + static_assert(std::numeric_limits<const volatile T>::is_specialized, + "std::numeric_limits<const volatile T>::is_specialized"); +} + +int main() +{ + test<bool>(); + test<char>(); + test<wchar_t>(); +#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS + test<char16_t>(); + test<char32_t>(); +#endif + test<signed char>(); + test<unsigned char>(); + test<signed short>(); + test<unsigned short>(); + test<signed int>(); + test<unsigned int>(); + test<signed long>(); + test<unsigned long>(); + test<signed long long>(); + test<unsigned long long>(); + test<float>(); + test<double>(); + test<long double>(); + static_assert(!std::numeric_limits<std::complex<double> >::is_specialized, + "!std::numeric_limits<std::complex<double> >::is_specialized"); +} diff --git a/libcxx/test/language.support/support.limits/limits/numeric.limits.members/denorm_min.pass.cpp b/libcxx/test/language.support/support.limits/limits/numeric.limits.members/denorm_min.pass.cpp new file mode 100644 index 00000000000..101fa757dae --- /dev/null +++ b/libcxx/test/language.support/support.limits/limits/numeric.limits.members/denorm_min.pass.cpp @@ -0,0 +1,49 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// test numeric_limits + +// denorm_min() + +#include <limits> +#include <cassert> + +template <class T> +void +test(T expected) +{ + assert(std::numeric_limits<T>::denorm_min() == expected); + assert(std::numeric_limits<const T>::denorm_min() == expected); + assert(std::numeric_limits<volatile T>::denorm_min() == expected); + assert(std::numeric_limits<const volatile T>::denorm_min() == expected); +} + +int main() +{ + test<bool>(false); + test<char>(0); + test<signed char>(0); + test<unsigned char>(0); + test<wchar_t>(0); +#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS + test<char16_t>(0); + test<char32_t>(0); +#endif + test<short>(0); + test<unsigned short>(0); + test<int>(0); + test<unsigned int>(0); + test<long>(0); + test<unsigned long>(0); + test<long long>(0); + test<unsigned long long>(0); + test<float>(__FLT_DENORM_MIN__); + test<double>(__DBL_DENORM_MIN__); + test<long double>(__LDBL_DENORM_MIN__); +} diff --git a/libcxx/test/language.support/support.limits/limits/numeric.limits.members/digits.pass.cpp b/libcxx/test/language.support/support.limits/limits/numeric.limits.members/digits.pass.cpp new file mode 100644 index 00000000000..58337ece5fd --- /dev/null +++ b/libcxx/test/language.support/support.limits/limits/numeric.limits.members/digits.pass.cpp @@ -0,0 +1,49 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// test numeric_limits + +// digits + +#include <limits> +#include <cfloat> + +template <class T, int expected> +void +test() +{ + static_assert(std::numeric_limits<T>::digits == expected, "digits test 1"); + static_assert(std::numeric_limits<const T>::digits == expected, "digits test 2"); + static_assert(std::numeric_limits<volatile T>::digits == expected, "digits test 3"); + static_assert(std::numeric_limits<const volatile T>::digits == expected, "digits test 4"); +} + +int main() +{ + test<bool, 1>(); + test<char, std::numeric_limits<char>::is_signed ? 7 : 8>(); + test<signed char, 7>(); + test<unsigned char, 8>(); + test<wchar_t, std::numeric_limits<wchar_t>::is_signed ? 31 : 32>(); +#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS + test<char16_t, 16>(); + test<char32_t, 32>(); +#endif + test<short, 15>(); + test<unsigned short, 16>(); + test<int, 31>(); + test<unsigned int, 32>(); + test<long, sizeof(long) == 4 ? 31 : 63>(); + test<unsigned long, sizeof(long) == 4 ? 32 : 64>(); + test<long long, 63>(); + test<unsigned long long, 64>(); + test<float, FLT_MANT_DIG>(); + test<double, DBL_MANT_DIG>(); + test<long double, LDBL_MANT_DIG>(); +} diff --git a/libcxx/test/language.support/support.limits/limits/numeric.limits.members/digits10.pass.cpp b/libcxx/test/language.support/support.limits/limits/numeric.limits.members/digits10.pass.cpp new file mode 100644 index 00000000000..6012d23cf6e --- /dev/null +++ b/libcxx/test/language.support/support.limits/limits/numeric.limits.members/digits10.pass.cpp @@ -0,0 +1,53 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// test numeric_limits + +// digits10 + +#include <limits> +#include <cfloat> + +template <class T, int expected> +void +test() +{ + static_assert(std::numeric_limits<T>::digits10 == expected, "digits10 test 1"); + static_assert(std::numeric_limits<T>::is_bounded, "digits10 test 5"); + static_assert(std::numeric_limits<const T>::digits10 == expected, "digits10 test 2"); + static_assert(std::numeric_limits<const T>::is_bounded, "digits10 test 6"); + static_assert(std::numeric_limits<volatile T>::digits10 == expected, "digits10 test 3"); + static_assert(std::numeric_limits<volatile T>::is_bounded, "digits10 test 7"); + static_assert(std::numeric_limits<const volatile T>::digits10 == expected, "digits10 test 4"); + static_assert(std::numeric_limits<const volatile T>::is_bounded, "digits10 test 8"); +} + +int main() +{ + test<bool, 0>(); + test<char, 2>(); + test<signed char, 2>(); + test<unsigned char, 2>(); + test<wchar_t, 9>(); +#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS + test<char16_t, 4>(); + test<char32_t, 9>(); +#endif + test<short, 4>(); + test<unsigned short, 4>(); + test<int, 9>(); + test<unsigned int, 9>(); + test<long, sizeof(long) == 4 ? 9 : 18>(); + test<unsigned long, sizeof(long) == 4 ? 9 : 19>(); + test<long long, 18>(); + test<unsigned long long, 19>(); + test<float, FLT_DIG>(); + test<double, DBL_DIG>(); + test<long double, LDBL_DIG>(); +} diff --git a/libcxx/test/language.support/support.limits/limits/numeric.limits.members/epsilon.pass.cpp b/libcxx/test/language.support/support.limits/limits/numeric.limits.members/epsilon.pass.cpp new file mode 100644 index 00000000000..0869f88fff2 --- /dev/null +++ b/libcxx/test/language.support/support.limits/limits/numeric.limits.members/epsilon.pass.cpp @@ -0,0 +1,50 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// test numeric_limits + +// epsilon() + +#include <limits> +#include <cfloat> +#include <cassert> + +template <class T> +void +test(T expected) +{ + assert(std::numeric_limits<T>::epsilon() == expected); + assert(std::numeric_limits<const T>::epsilon() == expected); + assert(std::numeric_limits<volatile T>::epsilon() == expected); + assert(std::numeric_limits<const volatile T>::epsilon() == expected); +} + +int main() +{ + test<bool>(false); + test<char>(0); + test<signed char>(0); + test<unsigned char>(0); + test<wchar_t>(0); +#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS + test<char16_t>(0); + test<char32_t>(0); +#endif + test<short>(0); + test<unsigned short>(0); + test<int>(0); + test<unsigned int>(0); + test<long>(0); + test<unsigned long>(0); + test<long long>(0); + test<unsigned long long>(0); + test<float>(FLT_EPSILON); + test<double>(DBL_EPSILON); + test<long double>(LDBL_EPSILON); +} diff --git a/libcxx/test/language.support/support.limits/limits/numeric.limits.members/has_denorm.pass.cpp b/libcxx/test/language.support/support.limits/limits/numeric.limits.members/has_denorm.pass.cpp new file mode 100644 index 00000000000..59c26267479 --- /dev/null +++ b/libcxx/test/language.support/support.limits/limits/numeric.limits.members/has_denorm.pass.cpp @@ -0,0 +1,48 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// test numeric_limits + +// has_denorm + +#include <limits> + +template <class T, std::float_denorm_style expected> +void +test() +{ + static_assert(std::numeric_limits<T>::has_denorm == expected, "has_denorm test 1"); + static_assert(std::numeric_limits<const T>::has_denorm == expected, "has_denorm test 2"); + static_assert(std::numeric_limits<volatile T>::has_denorm == expected, "has_denorm test 3"); + static_assert(std::numeric_limits<const volatile T>::has_denorm == expected, "has_denorm test 4"); +} + +int main() +{ + test<bool, std::denorm_absent>(); + test<char, std::denorm_absent>(); + test<signed char, std::denorm_absent>(); + test<unsigned char, std::denorm_absent>(); + test<wchar_t, std::denorm_absent>(); +#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS + test<char16_t, std::denorm_absent>(); + test<char32_t, std::denorm_absent>(); +#endif + test<short, std::denorm_absent>(); + test<unsigned short, std::denorm_absent>(); + test<int, std::denorm_absent>(); + test<unsigned int, std::denorm_absent>(); + test<long, std::denorm_absent>(); + test<unsigned long, std::denorm_absent>(); + test<long long, std::denorm_absent>(); + test<unsigned long long, std::denorm_absent>(); + test<float, std::denorm_present>(); + test<double, std::denorm_present>(); + test<long double, std::denorm_present>(); +} diff --git a/libcxx/test/language.support/support.limits/limits/numeric.limits.members/has_denorm_loss.pass.cpp b/libcxx/test/language.support/support.limits/limits/numeric.limits.members/has_denorm_loss.pass.cpp new file mode 100644 index 00000000000..3e23b95afbe --- /dev/null +++ b/libcxx/test/language.support/support.limits/limits/numeric.limits.members/has_denorm_loss.pass.cpp @@ -0,0 +1,48 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// test numeric_limits + +// has_denorm_loss + +#include <limits> + +template <class T, bool expected> +void +test() +{ + static_assert(std::numeric_limits<T>::has_denorm_loss == expected, "has_denorm_loss test 1"); + static_assert(std::numeric_limits<const T>::has_denorm_loss == expected, "has_denorm_loss test 2"); + static_assert(std::numeric_limits<volatile T>::has_denorm_loss == expected, "has_denorm_loss test 3"); + static_assert(std::numeric_limits<const volatile T>::has_denorm_loss == expected, "has_denorm_loss test 4"); +} + +int main() +{ + test<bool, false>(); + test<char, false>(); + test<signed char, false>(); + test<unsigned char, false>(); + test<wchar_t, false>(); +#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS + test<char16_t, false>(); + test<char32_t, false>(); +#endif + test<short, false>(); + test<unsigned short, false>(); + test<int, false>(); + test<unsigned int, false>(); + test<long, false>(); + test<unsigned long, false>(); + test<long long, false>(); + test<unsigned long long, false>(); + test<float, false>(); + test<double, false>(); + test<long double, false>(); +} diff --git a/libcxx/test/language.support/support.limits/limits/numeric.limits.members/has_infinity.pass.cpp b/libcxx/test/language.support/support.limits/limits/numeric.limits.members/has_infinity.pass.cpp new file mode 100644 index 00000000000..caf8ea3e636 --- /dev/null +++ b/libcxx/test/language.support/support.limits/limits/numeric.limits.members/has_infinity.pass.cpp @@ -0,0 +1,48 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// test numeric_limits + +// has_infinity + +#include <limits> + +template <class T, bool expected> +void +test() +{ + static_assert(std::numeric_limits<T>::has_infinity == expected, "has_infinity test 1"); + static_assert(std::numeric_limits<const T>::has_infinity == expected, "has_infinity test 2"); + static_assert(std::numeric_limits<volatile T>::has_infinity == expected, "has_infinity test 3"); + static_assert(std::numeric_limits<const volatile T>::has_infinity == expected, "has_infinity test 4"); +} + +int main() +{ + test<bool, false>(); + test<char, false>(); + test<signed char, false>(); + test<unsigned char, false>(); + test<wchar_t, false>(); +#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS + test<char16_t, false>(); + test<char32_t, false>(); +#endif + test<short, false>(); + test<unsigned short, false>(); + test<int, false>(); + test<unsigned int, false>(); + test<long, false>(); + test<unsigned long, false>(); + test<long long, false>(); + test<unsigned long long, false>(); + test<float, true>(); + test<double, true>(); + test<long double, true>(); +} diff --git a/libcxx/test/language.support/support.limits/limits/numeric.limits.members/has_quiet_NaN.pass.cpp b/libcxx/test/language.support/support.limits/limits/numeric.limits.members/has_quiet_NaN.pass.cpp new file mode 100644 index 00000000000..b3b2d63ef02 --- /dev/null +++ b/libcxx/test/language.support/support.limits/limits/numeric.limits.members/has_quiet_NaN.pass.cpp @@ -0,0 +1,48 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// test numeric_limits + +// has_quiet_NaN + +#include <limits> + +template <class T, bool expected> +void +test() +{ + static_assert(std::numeric_limits<T>::has_quiet_NaN == expected, "has_quiet_NaN test 1"); + static_assert(std::numeric_limits<const T>::has_quiet_NaN == expected, "has_quiet_NaN test 2"); + static_assert(std::numeric_limits<volatile T>::has_quiet_NaN == expected, "has_quiet_NaN test 3"); + static_assert(std::numeric_limits<const volatile T>::has_quiet_NaN == expected, "has_quiet_NaN test 4"); +} + +int main() +{ + test<bool, false>(); + test<char, false>(); + test<signed char, false>(); + test<unsigned char, false>(); + test<wchar_t, false>(); +#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS + test<char16_t, false>(); + test<char32_t, false>(); +#endif + test<short, false>(); + test<unsigned short, false>(); + test<int, false>(); + test<unsigned int, false>(); + test<long, false>(); + test<unsigned long, false>(); + test<long long, false>(); + test<unsigned long long, false>(); + test<float, true>(); + test<double, true>(); + test<long double, true>(); +} diff --git a/libcxx/test/language.support/support.limits/limits/numeric.limits.members/has_signaling_NaN.pass.cpp b/libcxx/test/language.support/support.limits/limits/numeric.limits.members/has_signaling_NaN.pass.cpp new file mode 100644 index 00000000000..28beab8d6ac --- /dev/null +++ b/libcxx/test/language.support/support.limits/limits/numeric.limits.members/has_signaling_NaN.pass.cpp @@ -0,0 +1,48 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// test numeric_limits + +// has_signaling_NaN + +#include <limits> + +template <class T, bool expected> +void +test() +{ + static_assert(std::numeric_limits<T>::has_signaling_NaN == expected, "has_signaling_NaN test 1"); + static_assert(std::numeric_limits<const T>::has_signaling_NaN == expected, "has_signaling_NaN test 2"); + static_assert(std::numeric_limits<volatile T>::has_signaling_NaN == expected, "has_signaling_NaN test 3"); + static_assert(std::numeric_limits<const volatile T>::has_signaling_NaN == expected, "has_signaling_NaN test 4"); +} + +int main() +{ + test<bool, false>(); + test<char, false>(); + test<signed char, false>(); + test<unsigned char, false>(); + test<wchar_t, false>(); +#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS + test<char16_t, false>(); + test<char32_t, false>(); +#endif + test<short, false>(); + test<unsigned short, false>(); + test<int, false>(); + test<unsigned int, false>(); + test<long, false>(); + test<unsigned long, false>(); + test<long long, false>(); + test<unsigned long long, false>(); + test<float, true>(); + test<double, true>(); + test<long double, true>(); +} diff --git a/libcxx/test/language.support/support.limits/limits/numeric.limits.members/infinity.pass.cpp b/libcxx/test/language.support/support.limits/limits/numeric.limits.members/infinity.pass.cpp new file mode 100644 index 00000000000..27033662613 --- /dev/null +++ b/libcxx/test/language.support/support.limits/limits/numeric.limits.members/infinity.pass.cpp @@ -0,0 +1,54 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// test numeric_limits + +// infinity() + +#include <limits> +#include <cfloat> +#include <cassert> + +template <class T> +void +test(T expected) +{ + assert(std::numeric_limits<T>::infinity() == expected); + assert(std::numeric_limits<const T>::infinity() == expected); + assert(std::numeric_limits<volatile T>::infinity() == expected); + assert(std::numeric_limits<const volatile T>::infinity() == expected); +} + +extern float zero; + +int main() +{ + test<bool>(false); + test<char>(0); + test<signed char>(0); + test<unsigned char>(0); + test<wchar_t>(0); +#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS + test<char16_t>(0); + test<char32_t>(0); +#endif + test<short>(0); + test<unsigned short>(0); + test<int>(0); + test<unsigned int>(0); + test<long>(0); + test<unsigned long>(0); + test<long long>(0); + test<unsigned long long>(0); + test<float>(1./zero); + test<double>(1./zero); + test<long double>(1./zero); +} + +float zero = 0; diff --git a/libcxx/test/language.support/support.limits/limits/numeric.limits.members/is_bounded.pass.cpp b/libcxx/test/language.support/support.limits/limits/numeric.limits.members/is_bounded.pass.cpp new file mode 100644 index 00000000000..e92b6df723a --- /dev/null +++ b/libcxx/test/language.support/support.limits/limits/numeric.limits.members/is_bounded.pass.cpp @@ -0,0 +1,48 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// test numeric_limits + +// is_bounded + +#include <limits> + +template <class T, bool expected> +void +test() +{ + static_assert(std::numeric_limits<T>::is_bounded == expected, "is_bounded test 1"); + static_assert(std::numeric_limits<const T>::is_bounded == expected, "is_bounded test 2"); + static_assert(std::numeric_limits<volatile T>::is_bounded == expected, "is_bounded test 3"); + static_assert(std::numeric_limits<const volatile T>::is_bounded == expected, "is_bounded test 4"); +} + +int main() +{ + test<bool, true>(); + test<char, true>(); + test<signed char, true>(); + test<unsigned char, true>(); + test<wchar_t, true>(); +#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS + test<char16_t, true>(); + test<char32_t, true>(); +#endif + test<short, true>(); + test<unsigned short, true>(); + test<int, true>(); + test<unsigned int, true>(); + test<long, true>(); + test<unsigned long, true>(); + test<long long, true>(); + test<unsigned long long, true>(); + test<float, true>(); + test<double, true>(); + test<long double, true>(); +} diff --git a/libcxx/test/language.support/support.limits/limits/numeric.limits.members/is_exact.pass.cpp b/libcxx/test/language.support/support.limits/limits/numeric.limits.members/is_exact.pass.cpp new file mode 100644 index 00000000000..3c41e9b41bd --- /dev/null +++ b/libcxx/test/language.support/support.limits/limits/numeric.limits.members/is_exact.pass.cpp @@ -0,0 +1,48 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// test numeric_limits + +// is_exact + +#include <limits> + +template <class T, bool expected> +void +test() +{ + static_assert(std::numeric_limits<T>::is_exact == expected, "is_exact test 1"); + static_assert(std::numeric_limits<const T>::is_exact == expected, "is_exact test 2"); + static_assert(std::numeric_limits<volatile T>::is_exact == expected, "is_exact test 3"); + static_assert(std::numeric_limits<const volatile T>::is_exact == expected, "is_exact test 4"); +} + +int main() +{ + test<bool, true>(); + test<char, true>(); + test<signed char, true>(); + test<unsigned char, true>(); + test<wchar_t, true>(); +#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS + test<char16_t, true>(); + test<char32_t, true>(); +#endif + test<short, true>(); + test<unsigned short, true>(); + test<int, true>(); + test<unsigned int, true>(); + test<long, true>(); + test<unsigned long, true>(); + test<long long, true>(); + test<unsigned long long, true>(); + test<float, false>(); + test<double, false>(); + test<long double, false>(); +} diff --git a/libcxx/test/language.support/support.limits/limits/numeric.limits.members/is_iec559.pass.cpp b/libcxx/test/language.support/support.limits/limits/numeric.limits.members/is_iec559.pass.cpp new file mode 100644 index 00000000000..21574a249ac --- /dev/null +++ b/libcxx/test/language.support/support.limits/limits/numeric.limits.members/is_iec559.pass.cpp @@ -0,0 +1,48 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// test numeric_limits + +// is_iec559 + +#include <limits> + +template <class T, bool expected> +void +test() +{ + static_assert(std::numeric_limits<T>::is_iec559 == expected, "is_iec559 test 1"); + static_assert(std::numeric_limits<const T>::is_iec559 == expected, "is_iec559 test 2"); + static_assert(std::numeric_limits<volatile T>::is_iec559 == expected, "is_iec559 test 3"); + static_assert(std::numeric_limits<const volatile T>::is_iec559 == expected, "is_iec559 test 4"); +} + +int main() +{ + test<bool, false>(); + test<char, false>(); + test<signed char, false>(); + test<unsigned char, false>(); + test<wchar_t, false>(); +#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS + test<char16_t, false>(); + test<char32_t, false>(); +#endif + test<short, false>(); + test<unsigned short, false>(); + test<int, false>(); + test<unsigned int, false>(); + test<long, false>(); + test<unsigned long, false>(); + test<long long, false>(); + test<unsigned long long, false>(); + test<float, true>(); + test<double, true>(); + test<long double, true>(); +} diff --git a/libcxx/test/language.support/support.limits/limits/numeric.limits.members/is_integer.pass.cpp b/libcxx/test/language.support/support.limits/limits/numeric.limits.members/is_integer.pass.cpp new file mode 100644 index 00000000000..1c44d3fb307 --- /dev/null +++ b/libcxx/test/language.support/support.limits/limits/numeric.limits.members/is_integer.pass.cpp @@ -0,0 +1,48 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// test numeric_limits + +// is_integer + +#include <limits> + +template <class T, bool expected> +void +test() +{ + static_assert(std::numeric_limits<T>::is_integer == expected, "is_integer test 1"); + static_assert(std::numeric_limits<const T>::is_integer == expected, "is_integer test 2"); + static_assert(std::numeric_limits<volatile T>::is_integer == expected, "is_integer test 3"); + static_assert(std::numeric_limits<const volatile T>::is_integer == expected, "is_integer test 4"); +} + +int main() +{ + test<bool, true>(); + test<char, true>(); + test<signed char, true>(); + test<unsigned char, true>(); + test<wchar_t, true>(); +#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS + test<char16_t, true>(); + test<char32_t, true>(); +#endif + test<short, true>(); + test<unsigned short, true>(); + test<int, true>(); + test<unsigned int, true>(); + test<long, true>(); + test<unsigned long, true>(); + test<long long, true>(); + test<unsigned long long, true>(); + test<float, false>(); + test<double, false>(); + test<long double, false>(); +} diff --git a/libcxx/test/language.support/support.limits/limits/numeric.limits.members/is_modulo.pass.cpp b/libcxx/test/language.support/support.limits/limits/numeric.limits.members/is_modulo.pass.cpp new file mode 100644 index 00000000000..4bb8cae7db9 --- /dev/null +++ b/libcxx/test/language.support/support.limits/limits/numeric.limits.members/is_modulo.pass.cpp @@ -0,0 +1,48 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// test numeric_limits + +// is_modulo + +#include <limits> + +template <class T, bool expected> +void +test() +{ + static_assert(std::numeric_limits<T>::is_modulo == expected, "is_modulo test 1"); + static_assert(std::numeric_limits<const T>::is_modulo == expected, "is_modulo test 2"); + static_assert(std::numeric_limits<volatile T>::is_modulo == expected, "is_modulo test 3"); + static_assert(std::numeric_limits<const volatile T>::is_modulo == expected, "is_modulo test 4"); +} + +int main() +{ + test<bool, false>(); + test<char, true>(); + test<signed char, true>(); + test<unsigned char, true>(); + test<wchar_t, true>(); +#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS + test<char16_t, true>(); + test<char32_t, true>(); +#endif + test<short, true>(); + test<unsigned short, true>(); + test<int, true>(); + test<unsigned int, true>(); + test<long, true>(); + test<unsigned long, true>(); + test<long long, true>(); + test<unsigned long long, true>(); + test<float, false>(); + test<double, false>(); + test<long double, false>(); +} diff --git a/libcxx/test/language.support/support.limits/limits/numeric.limits.members/is_signed.pass.cpp b/libcxx/test/language.support/support.limits/limits/numeric.limits.members/is_signed.pass.cpp new file mode 100644 index 00000000000..7ef84b0c6b6 --- /dev/null +++ b/libcxx/test/language.support/support.limits/limits/numeric.limits.members/is_signed.pass.cpp @@ -0,0 +1,48 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// test numeric_limits + +// is_signed + +#include <limits> + +template <class T, bool expected> +void +test() +{ + static_assert(std::numeric_limits<T>::is_signed == expected, "is_signed test 1"); + static_assert(std::numeric_limits<const T>::is_signed == expected, "is_signed test 2"); + static_assert(std::numeric_limits<volatile T>::is_signed == expected, "is_signed test 3"); + static_assert(std::numeric_limits<const volatile T>::is_signed == expected, "is_signed test 4"); +} + +int main() +{ + test<bool, false>(); + test<char, char(-1) < char(0)>(); + test<signed char, true>(); + test<unsigned char, false>(); + test<wchar_t, wchar_t(-1) < wchar_t(0)>(); +#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS + test<char16_t, false>(); + test<char32_t, false>(); +#endif + test<short, true>(); + test<unsigned short, false>(); + test<int, true>(); + test<unsigned int, false>(); + test<long, true>(); + test<unsigned long, false>(); + test<long long, true>(); + test<unsigned long long, false>(); + test<float, true>(); + test<double, true>(); + test<long double, true>(); +} diff --git a/libcxx/test/language.support/support.limits/limits/numeric.limits.members/lowest.pass.cpp b/libcxx/test/language.support/support.limits/limits/numeric.limits.members/lowest.pass.cpp new file mode 100644 index 00000000000..8a0a3b3a85e --- /dev/null +++ b/libcxx/test/language.support/support.limits/limits/numeric.limits.members/lowest.pass.cpp @@ -0,0 +1,56 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// test numeric_limits + +// lowest() + +#include <limits> +#include <climits> +#include <cwchar> +#include <cfloat> +#include <cassert> + +template <class T> +void +test(T expected) +{ + assert(std::numeric_limits<T>::lowest() == expected); + assert(std::numeric_limits<T>::is_bounded); + assert(std::numeric_limits<const T>::lowest() == expected); + assert(std::numeric_limits<const T>::is_bounded); + assert(std::numeric_limits<volatile T>::lowest() == expected); + assert(std::numeric_limits<volatile T>::is_bounded); + assert(std::numeric_limits<const volatile T>::lowest() == expected); + assert(std::numeric_limits<const volatile T>::is_bounded); +} + +int main() +{ + test<bool>(false); + test<char>(CHAR_MIN); + test<signed char>(SCHAR_MIN); + test<unsigned char>(0); + test<wchar_t>(WCHAR_MIN); +#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS + test<char16_t>(0); + test<char32_t>(0); +#endif + test<short>(SHRT_MIN); + test<unsigned short>(0); + test<int>(INT_MIN); + test<unsigned int>(0); + test<long>(LONG_MIN); + test<unsigned long>(0); + test<long long>(LLONG_MIN); + test<unsigned long long>(0); + test<float>(-FLT_MAX); + test<double>(-DBL_MAX); + test<long double>(-LDBL_MAX); +} diff --git a/libcxx/test/language.support/support.limits/limits/numeric.limits.members/max.pass.cpp b/libcxx/test/language.support/support.limits/limits/numeric.limits.members/max.pass.cpp new file mode 100644 index 00000000000..2cdbec8f8d7 --- /dev/null +++ b/libcxx/test/language.support/support.limits/limits/numeric.limits.members/max.pass.cpp @@ -0,0 +1,56 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// test numeric_limits + +// max() + +#include <limits> +#include <climits> +#include <cwchar> +#include <cfloat> +#include <cassert> + +template <class T> +void +test(T expected) +{ + assert(std::numeric_limits<T>::max() == expected); + assert(std::numeric_limits<T>::is_bounded); + assert(std::numeric_limits<const T>::max() == expected); + assert(std::numeric_limits<const T>::is_bounded); + assert(std::numeric_limits<volatile T>::max() == expected); + assert(std::numeric_limits<volatile T>::is_bounded); + assert(std::numeric_limits<const volatile T>::max() == expected); + assert(std::numeric_limits<const volatile T>::is_bounded); +} + +int main() +{ + test<bool>(true); + test<char>(CHAR_MAX); + test<signed char>(SCHAR_MAX); + test<unsigned char>(UCHAR_MAX); + test<wchar_t>(WCHAR_MAX); +#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS + test<char16_t>(USHRT_MAX); + test<char32_t>(UINT_MAX); +#endif + test<short>(SHRT_MAX); + test<unsigned short>(USHRT_MAX); + test<int>(INT_MAX); + test<unsigned int>(UINT_MAX); + test<long>(LONG_MAX); + test<unsigned long>(ULONG_MAX); + test<long long>(LLONG_MAX); + test<unsigned long long>(ULLONG_MAX); + test<float>(FLT_MAX); + test<double>(DBL_MAX); + test<long double>(LDBL_MAX); +} diff --git a/libcxx/test/language.support/support.limits/limits/numeric.limits.members/max_digits10.pass.cpp b/libcxx/test/language.support/support.limits/limits/numeric.limits.members/max_digits10.pass.cpp new file mode 100644 index 00000000000..f4faa6b4e95 --- /dev/null +++ b/libcxx/test/language.support/support.limits/limits/numeric.limits.members/max_digits10.pass.cpp @@ -0,0 +1,49 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// test numeric_limits + +// max_digits10 + +#include <limits> +#include <cfloat> + +template <class T, int expected> +void +test() +{ + static_assert(std::numeric_limits<T>::max_digits10 == expected, "max_digits10 test 1"); + static_assert(std::numeric_limits<const T>::max_digits10 == expected, "max_digits10 test 2"); + static_assert(std::numeric_limits<volatile T>::max_digits10 == expected, "max_digits10 test 3"); + static_assert(std::numeric_limits<const volatile T>::max_digits10 == expected, "max_digits10 test 4"); +} + +int main() +{ + test<bool, 0>(); + test<char, 0>(); + test<signed char, 0>(); + test<unsigned char, 0>(); + test<wchar_t, 0>(); +#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS + test<char16_t, 0>(); + test<char32_t, 0>(); +#endif + test<short, 0>(); + test<unsigned short, 0>(); + test<int, 0>(); + test<unsigned int, 0>(); + test<long, 0>(); + test<unsigned long, 0>(); + test<long long, 0>(); + test<unsigned long long, 0>(); + test<float, 2+(FLT_MANT_DIG * 30103)/100000>(); + test<double, 2+(DBL_MANT_DIG * 30103)/100000>(); + test<long double, 2+(LDBL_MANT_DIG * 30103)/100000>(); +} diff --git a/libcxx/test/language.support/support.limits/limits/numeric.limits.members/max_exponent.pass.cpp b/libcxx/test/language.support/support.limits/limits/numeric.limits.members/max_exponent.pass.cpp new file mode 100644 index 00000000000..b6c222b4496 --- /dev/null +++ b/libcxx/test/language.support/support.limits/limits/numeric.limits.members/max_exponent.pass.cpp @@ -0,0 +1,49 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// test numeric_limits + +// max_exponent + +#include <limits> +#include <cfloat> + +template <class T, int expected> +void +test() +{ + static_assert(std::numeric_limits<T>::max_exponent == expected, "max_exponent test 1"); + static_assert(std::numeric_limits<const T>::max_exponent == expected, "max_exponent test 2"); + static_assert(std::numeric_limits<volatile T>::max_exponent == expected, "max_exponent test 3"); + static_assert(std::numeric_limits<const volatile T>::max_exponent == expected, "max_exponent test 4"); +} + +int main() +{ + test<bool, 0>(); + test<char, 0>(); + test<signed char, 0>(); + test<unsigned char, 0>(); + test<wchar_t, 0>(); +#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS + test<char16_t, 0>(); + test<char32_t, 0>(); +#endif + test<short, 0>(); + test<unsigned short, 0>(); + test<int, 0>(); + test<unsigned int, 0>(); + test<long, 0>(); + test<unsigned long, 0>(); + test<long long, 0>(); + test<unsigned long long, 0>(); + test<float, FLT_MAX_EXP>(); + test<double, DBL_MAX_EXP>(); + test<long double, LDBL_MAX_EXP>(); +} diff --git a/libcxx/test/language.support/support.limits/limits/numeric.limits.members/max_exponent10.pass.cpp b/libcxx/test/language.support/support.limits/limits/numeric.limits.members/max_exponent10.pass.cpp new file mode 100644 index 00000000000..0df080a65c0 --- /dev/null +++ b/libcxx/test/language.support/support.limits/limits/numeric.limits.members/max_exponent10.pass.cpp @@ -0,0 +1,49 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// test numeric_limits + +// max_exponent10 + +#include <limits> +#include <cfloat> + +template <class T, int expected> +void +test() +{ + static_assert(std::numeric_limits<T>::max_exponent10 == expected, "max_exponent10 test 1"); + static_assert(std::numeric_limits<const T>::max_exponent10 == expected, "max_exponent10 test 2"); + static_assert(std::numeric_limits<volatile T>::max_exponent10 == expected, "max_exponent10 test 3"); + static_assert(std::numeric_limits<const volatile T>::max_exponent10 == expected, "max_exponent10 test 4"); +} + +int main() +{ + test<bool, 0>(); + test<char, 0>(); + test<signed char, 0>(); + test<unsigned char, 0>(); + test<wchar_t, 0>(); +#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS + test<char16_t, 0>(); + test<char32_t, 0>(); +#endif + test<short, 0>(); + test<unsigned short, 0>(); + test<int, 0>(); + test<unsigned int, 0>(); + test<long, 0>(); + test<unsigned long, 0>(); + test<long long, 0>(); + test<unsigned long long, 0>(); + test<float, FLT_MAX_10_EXP>(); + test<double, DBL_MAX_10_EXP>(); + test<long double, LDBL_MAX_10_EXP>(); +} diff --git a/libcxx/test/language.support/support.limits/limits/numeric.limits.members/min.pass.cpp b/libcxx/test/language.support/support.limits/limits/numeric.limits.members/min.pass.cpp new file mode 100644 index 00000000000..f67fa9ef167 --- /dev/null +++ b/libcxx/test/language.support/support.limits/limits/numeric.limits.members/min.pass.cpp @@ -0,0 +1,56 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// test numeric_limits + +// min() + +#include <limits> +#include <climits> +#include <cwchar> +#include <cfloat> +#include <cassert> + +template <class T> +void +test(T expected) +{ + assert(std::numeric_limits<T>::min() == expected); + assert(std::numeric_limits<T>::is_bounded || !std::numeric_limits<T>::is_signed); + assert(std::numeric_limits<const T>::min() == expected); + assert(std::numeric_limits<const T>::is_bounded || !std::numeric_limits<const T>::is_signed); + assert(std::numeric_limits<volatile T>::min() == expected); + assert(std::numeric_limits<volatile T>::is_bounded || !std::numeric_limits<volatile T>::is_signed); + assert(std::numeric_limits<const volatile T>::min() == expected); + assert(std::numeric_limits<const volatile T>::is_bounded || !std::numeric_limits<const volatile T>::is_signed); +} + +int main() +{ + test<bool>(false); + test<char>(CHAR_MIN); + test<signed char>(SCHAR_MIN); + test<unsigned char>(0); + test<wchar_t>(WCHAR_MIN); +#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS + test<char16_t>(0); + test<char32_t>(0); +#endif + test<short>(SHRT_MIN); + test<unsigned short>(0); + test<int>(INT_MIN); + test<unsigned int>(0); + test<long>(LONG_MIN); + test<unsigned long>(0); + test<long long>(LLONG_MIN); + test<unsigned long long>(0); + test<float>(FLT_MIN); + test<double>(DBL_MIN); + test<long double>(LDBL_MIN); +} diff --git a/libcxx/test/language.support/support.limits/limits/numeric.limits.members/min_exponent.pass.cpp b/libcxx/test/language.support/support.limits/limits/numeric.limits.members/min_exponent.pass.cpp new file mode 100644 index 00000000000..531d25a5848 --- /dev/null +++ b/libcxx/test/language.support/support.limits/limits/numeric.limits.members/min_exponent.pass.cpp @@ -0,0 +1,49 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// test numeric_limits + +// min_exponent + +#include <limits> +#include <cfloat> + +template <class T, int expected> +void +test() +{ + static_assert(std::numeric_limits<T>::min_exponent == expected, "min_exponent test 1"); + static_assert(std::numeric_limits<const T>::min_exponent == expected, "min_exponent test 2"); + static_assert(std::numeric_limits<volatile T>::min_exponent == expected, "min_exponent test 3"); + static_assert(std::numeric_limits<const volatile T>::min_exponent == expected, "min_exponent test 4"); +} + +int main() +{ + test<bool, 0>(); + test<char, 0>(); + test<signed char, 0>(); + test<unsigned char, 0>(); + test<wchar_t, 0>(); +#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS + test<char16_t, 0>(); + test<char32_t, 0>(); +#endif + test<short, 0>(); + test<unsigned short, 0>(); + test<int, 0>(); + test<unsigned int, 0>(); + test<long, 0>(); + test<unsigned long, 0>(); + test<long long, 0>(); + test<unsigned long long, 0>(); + test<float, FLT_MIN_EXP>(); + test<double, DBL_MIN_EXP>(); + test<long double, LDBL_MIN_EXP>(); +} diff --git a/libcxx/test/language.support/support.limits/limits/numeric.limits.members/min_exponent10.pass.cpp b/libcxx/test/language.support/support.limits/limits/numeric.limits.members/min_exponent10.pass.cpp new file mode 100644 index 00000000000..5f335fe1e37 --- /dev/null +++ b/libcxx/test/language.support/support.limits/limits/numeric.limits.members/min_exponent10.pass.cpp @@ -0,0 +1,49 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// test numeric_limits + +// min_exponent10 + +#include <limits> +#include <cfloat> + +template <class T, int expected> +void +test() +{ + static_assert(std::numeric_limits<T>::min_exponent10 == expected, "min_exponent10 test 1"); + static_assert(std::numeric_limits<const T>::min_exponent10 == expected, "min_exponent10 test 2"); + static_assert(std::numeric_limits<volatile T>::min_exponent10 == expected, "min_exponent10 test 3"); + static_assert(std::numeric_limits<const volatile T>::min_exponent10 == expected, "min_exponent10 test 4"); +} + +int main() +{ + test<bool, 0>(); + test<char, 0>(); + test<signed char, 0>(); + test<unsigned char, 0>(); + test<wchar_t, 0>(); +#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS + test<char16_t, 0>(); + test<char32_t, 0>(); +#endif + test<short, 0>(); + test<unsigned short, 0>(); + test<int, 0>(); + test<unsigned int, 0>(); + test<long, 0>(); + test<unsigned long, 0>(); + test<long long, 0>(); + test<unsigned long long, 0>(); + test<float, FLT_MIN_10_EXP>(); + test<double, DBL_MIN_10_EXP>(); + test<long double, LDBL_MIN_10_EXP>(); +} diff --git a/libcxx/test/language.support/support.limits/limits/numeric.limits.members/quiet_NaN.pass.cpp b/libcxx/test/language.support/support.limits/limits/numeric.limits.members/quiet_NaN.pass.cpp new file mode 100644 index 00000000000..7ce5130e79e --- /dev/null +++ b/libcxx/test/language.support/support.limits/limits/numeric.limits.members/quiet_NaN.pass.cpp @@ -0,0 +1,69 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// test numeric_limits + +// quiet_NaN() + +#include <limits> +#include <cmath> +#include <type_traits> +#include <cassert> + +template <class T> +void +test_imp(std::true_type) +{ + assert(std::isnan(std::numeric_limits<T>::quiet_NaN())); + assert(std::isnan(std::numeric_limits<const T>::quiet_NaN())); + assert(std::isnan(std::numeric_limits<volatile T>::quiet_NaN())); + assert(std::isnan(std::numeric_limits<const volatile T>::quiet_NaN())); +} + +template <class T> +void +test_imp(std::false_type) +{ + assert(std::numeric_limits<T>::quiet_NaN() == T()); + assert(std::numeric_limits<const T>::quiet_NaN() == T()); + assert(std::numeric_limits<volatile T>::quiet_NaN() == T()); + assert(std::numeric_limits<const volatile T>::quiet_NaN() == T()); +} + +template <class T> +inline +void +test() +{ + test_imp<T>(std::is_floating_point<T>()); +} + +int main() +{ + test<bool>(); + test<char>(); + test<signed char>(); + test<unsigned char>(); + test<wchar_t>(); +#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS + test<char16_t>(); + test<char32_t>(); +#endif + test<short>(); + test<unsigned short>(); + test<int>(); + test<unsigned int>(); + test<long>(); + test<unsigned long>(); + test<long long>(); + test<unsigned long long>(); + test<float>(); + test<double>(); + test<long double>(); +} diff --git a/libcxx/test/language.support/support.limits/limits/numeric.limits.members/radix.pass.cpp b/libcxx/test/language.support/support.limits/limits/numeric.limits.members/radix.pass.cpp new file mode 100644 index 00000000000..b9f1f0c6e0a --- /dev/null +++ b/libcxx/test/language.support/support.limits/limits/numeric.limits.members/radix.pass.cpp @@ -0,0 +1,49 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// test numeric_limits + +// radix + +#include <limits> +#include <cfloat> + +template <class T, int expected> +void +test() +{ + static_assert(std::numeric_limits<T>::radix == expected, "radix test 1"); + static_assert(std::numeric_limits<const T>::radix == expected, "radix test 2"); + static_assert(std::numeric_limits<volatile T>::radix == expected, "radix test 3"); + static_assert(std::numeric_limits<const volatile T>::radix == expected, "radix test 4"); +} + +int main() +{ + test<bool, 2>(); + test<char, 2>(); + test<signed char, 2>(); + test<unsigned char, 2>(); + test<wchar_t, 2>(); +#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS + test<char16_t, 2>(); + test<char32_t, 2>(); +#endif + test<short, 2>(); + test<unsigned short, 2>(); + test<int, 2>(); + test<unsigned int, 2>(); + test<long, 2>(); + test<unsigned long, 2>(); + test<long long, 2>(); + test<unsigned long long, 2>(); + test<float, FLT_RADIX>(); + test<double, FLT_RADIX>(); + test<long double, FLT_RADIX>(); +} diff --git a/libcxx/test/language.support/support.limits/limits/numeric.limits.members/round_error.pass.cpp b/libcxx/test/language.support/support.limits/limits/numeric.limits.members/round_error.pass.cpp new file mode 100644 index 00000000000..19c22b8cfa4 --- /dev/null +++ b/libcxx/test/language.support/support.limits/limits/numeric.limits.members/round_error.pass.cpp @@ -0,0 +1,50 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// test numeric_limits + +// round_error() + +#include <limits> +#include <cfloat> +#include <cassert> + +template <class T> +void +test(T expected) +{ + assert(std::numeric_limits<T>::round_error() == expected); + assert(std::numeric_limits<const T>::round_error() == expected); + assert(std::numeric_limits<volatile T>::round_error() == expected); + assert(std::numeric_limits<const volatile T>::round_error() == expected); +} + +int main() +{ + test<bool>(false); + test<char>(0); + test<signed char>(0); + test<unsigned char>(0); + test<wchar_t>(0); +#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS + test<char16_t>(0); + test<char32_t>(0); +#endif + test<short>(0); + test<unsigned short>(0); + test<int>(0); + test<unsigned int>(0); + test<long>(0); + test<unsigned long>(0); + test<long long>(0); + test<unsigned long long>(0); + test<float>(0.5); + test<double>(0.5); + test<long double>(0.5); +} diff --git a/libcxx/test/language.support/support.limits/limits/numeric.limits.members/round_style.pass.cpp b/libcxx/test/language.support/support.limits/limits/numeric.limits.members/round_style.pass.cpp new file mode 100644 index 00000000000..d0c7259fd95 --- /dev/null +++ b/libcxx/test/language.support/support.limits/limits/numeric.limits.members/round_style.pass.cpp @@ -0,0 +1,48 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// test numeric_limits + +// round_style + +#include <limits> + +template <class T, std::float_round_style expected> +void +test() +{ + static_assert(std::numeric_limits<T>::round_style == expected, "round_style test 1"); + static_assert(std::numeric_limits<const T>::round_style == expected, "round_style test 2"); + static_assert(std::numeric_limits<volatile T>::round_style == expected, "round_style test 3"); + static_assert(std::numeric_limits<const volatile T>::round_style == expected, "round_style test 4"); +} + +int main() +{ + test<bool, std::round_toward_zero>(); + test<char, std::round_toward_zero>(); + test<signed char, std::round_toward_zero>(); + test<unsigned char, std::round_toward_zero>(); + test<wchar_t, std::round_toward_zero>(); +#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS + test<char16_t, std::round_toward_zero>(); + test<char32_t, std::round_toward_zero>(); +#endif + test<short, std::round_toward_zero>(); + test<unsigned short, std::round_toward_zero>(); + test<int, std::round_toward_zero>(); + test<unsigned int, std::round_toward_zero>(); + test<long, std::round_toward_zero>(); + test<unsigned long, std::round_toward_zero>(); + test<long long, std::round_toward_zero>(); + test<unsigned long long, std::round_toward_zero>(); + test<float, std::round_to_nearest>(); + test<double, std::round_to_nearest>(); + test<long double, std::round_to_nearest>(); +} diff --git a/libcxx/test/language.support/support.limits/limits/numeric.limits.members/signaling_NaN.pass.cpp b/libcxx/test/language.support/support.limits/limits/numeric.limits.members/signaling_NaN.pass.cpp new file mode 100644 index 00000000000..8acd6b8baef --- /dev/null +++ b/libcxx/test/language.support/support.limits/limits/numeric.limits.members/signaling_NaN.pass.cpp @@ -0,0 +1,69 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// test numeric_limits + +// signaling_NaN() + +#include <limits> +#include <cmath> +#include <type_traits> +#include <cassert> + +template <class T> +void +test_imp(std::true_type) +{ + assert(std::isnan(std::numeric_limits<T>::signaling_NaN())); + assert(std::isnan(std::numeric_limits<const T>::signaling_NaN())); + assert(std::isnan(std::numeric_limits<volatile T>::signaling_NaN())); + assert(std::isnan(std::numeric_limits<const volatile T>::signaling_NaN())); +} + +template <class T> +void +test_imp(std::false_type) +{ + assert(std::numeric_limits<T>::signaling_NaN() == T()); + assert(std::numeric_limits<const T>::signaling_NaN() == T()); + assert(std::numeric_limits<volatile T>::signaling_NaN() == T()); + assert(std::numeric_limits<const volatile T>::signaling_NaN() == T()); +} + +template <class T> +inline +void +test() +{ + test_imp<T>(std::is_floating_point<T>()); +} + +int main() +{ + test<bool>(); + test<char>(); + test<signed char>(); + test<unsigned char>(); + test<wchar_t>(); +#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS + test<char16_t>(); + test<char32_t>(); +#endif + test<short>(); + test<unsigned short>(); + test<int>(); + test<unsigned int>(); + test<long>(); + test<unsigned long>(); + test<long long>(); + test<unsigned long long>(); + test<float>(); + test<double>(); + test<long double>(); +} diff --git a/libcxx/test/language.support/support.limits/limits/numeric.limits.members/tinyness_before.pass.cpp b/libcxx/test/language.support/support.limits/limits/numeric.limits.members/tinyness_before.pass.cpp new file mode 100644 index 00000000000..8c3fbd0f40f --- /dev/null +++ b/libcxx/test/language.support/support.limits/limits/numeric.limits.members/tinyness_before.pass.cpp @@ -0,0 +1,48 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// test numeric_limits + +// tinyness_before + +#include <limits> + +template <class T, bool expected> +void +test() +{ + static_assert(std::numeric_limits<T>::tinyness_before == expected, "tinyness_before test 1"); + static_assert(std::numeric_limits<const T>::tinyness_before == expected, "tinyness_before test 2"); + static_assert(std::numeric_limits<volatile T>::tinyness_before == expected, "tinyness_before test 3"); + static_assert(std::numeric_limits<const volatile T>::tinyness_before == expected, "tinyness_before test 4"); +} + +int main() +{ + test<bool, false>(); + test<char, false>(); + test<signed char, false>(); + test<unsigned char, false>(); + test<wchar_t, false>(); +#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS + test<char16_t, false>(); + test<char32_t, false>(); +#endif + test<short, false>(); + test<unsigned short, false>(); + test<int, false>(); + test<unsigned int, false>(); + test<long, false>(); + test<unsigned long, false>(); + test<long long, false>(); + test<unsigned long long, false>(); + test<float, false>(); + test<double, false>(); + test<long double, false>(); +} diff --git a/libcxx/test/language.support/support.limits/limits/numeric.limits.members/traps.pass.cpp b/libcxx/test/language.support/support.limits/limits/numeric.limits.members/traps.pass.cpp new file mode 100644 index 00000000000..2b8d167906c --- /dev/null +++ b/libcxx/test/language.support/support.limits/limits/numeric.limits.members/traps.pass.cpp @@ -0,0 +1,48 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// test numeric_limits + +// traps + +#include <limits> + +template <class T, bool expected> +void +test() +{ + static_assert(std::numeric_limits<T>::traps == expected, "traps test 1"); + static_assert(std::numeric_limits<const T>::traps == expected, "traps test 2"); + static_assert(std::numeric_limits<volatile T>::traps == expected, "traps test 3"); + static_assert(std::numeric_limits<const volatile T>::traps == expected, "traps test 4"); +} + +int main() +{ + test<bool, false>(); + test<char, true>(); + test<signed char, true>(); + test<unsigned char, true>(); + test<wchar_t, true>(); +#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS + test<char16_t, true>(); + test<char32_t, true>(); +#endif + test<short, true>(); + test<unsigned short, true>(); + test<int, true>(); + test<unsigned int, true>(); + test<long, true>(); + test<unsigned long, true>(); + test<long long, true>(); + test<unsigned long long, true>(); + test<float, false>(); + test<double, false>(); + test<long double, false>(); +} diff --git a/libcxx/test/language.support/support.limits/limits/numeric.limits/default.pass.cpp b/libcxx/test/language.support/support.limits/limits/numeric.limits/default.pass.cpp new file mode 100644 index 00000000000..c9d07de1182 --- /dev/null +++ b/libcxx/test/language.support/support.limits/limits/numeric.limits/default.pass.cpp @@ -0,0 +1,83 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// test numeric_limits + +// The default numeric_limits<T> template shall have all members, but with +// 0 or false values. + +#include <limits> +#include <cassert> + +struct A +{ + A(int i = 0) : data_(i) {} + int data_; +}; + +bool operator == (const A& x, const A& y) {return x.data_ == y.data_;} + +int main() +{ + static_assert(std::numeric_limits<A>::is_specialized == false, + "std::numeric_limits<A>::is_specialized == false"); + assert(std::numeric_limits<A>::min() == A()); + assert(std::numeric_limits<A>::max() == A()); + assert(std::numeric_limits<A>::lowest() == A()); + static_assert(std::numeric_limits<A>::digits == 0, + "std::numeric_limits<A>::digits == 0"); + static_assert(std::numeric_limits<A>::digits10 == 0, + "std::numeric_limits<A>::digits10 == 0"); + static_assert(std::numeric_limits<A>::max_digits10 == 0, + "std::numeric_limits<A>::max_digits10 == 0"); + static_assert(std::numeric_limits<A>::is_signed == false, + "std::numeric_limits<A>::is_signed == false"); + static_assert(std::numeric_limits<A>::is_integer == false, + "std::numeric_limits<A>::is_integer == false"); + static_assert(std::numeric_limits<A>::is_exact == false, + "std::numeric_limits<A>::is_exact == false"); + static_assert(std::numeric_limits<A>::radix == 0, + "std::numeric_limits<A>::radix == 0"); + assert(std::numeric_limits<A>::epsilon() == A()); + assert(std::numeric_limits<A>::round_error() == A()); + static_assert(std::numeric_limits<A>::min_exponent == 0, + "std::numeric_limits<A>::min_exponent == 0"); + static_assert(std::numeric_limits<A>::min_exponent10 == 0, + "std::numeric_limits<A>::min_exponent10 == 0"); + static_assert(std::numeric_limits<A>::max_exponent == 0, + "std::numeric_limits<A>::max_exponent == 0"); + static_assert(std::numeric_limits<A>::max_exponent10 == 0, + "std::numeric_limits<A>::max_exponent10 == 0"); + static_assert(std::numeric_limits<A>::has_infinity == false, + "std::numeric_limits<A>::has_infinity == false"); + static_assert(std::numeric_limits<A>::has_quiet_NaN == false, + "std::numeric_limits<A>::has_quiet_NaN == false"); + static_assert(std::numeric_limits<A>::has_signaling_NaN == false, + "std::numeric_limits<A>::has_signaling_NaN == false"); + static_assert(std::numeric_limits<A>::has_denorm == std::denorm_absent, + "std::numeric_limits<A>::has_denorm == std::denorm_absent"); + static_assert(std::numeric_limits<A>::has_denorm_loss == false, + "std::numeric_limits<A>::has_denorm_loss == false"); + assert(std::numeric_limits<A>::infinity() == A()); + assert(std::numeric_limits<A>::quiet_NaN() == A()); + assert(std::numeric_limits<A>::signaling_NaN() == A()); + assert(std::numeric_limits<A>::denorm_min() == A()); + static_assert(std::numeric_limits<A>::is_iec559 == false, + "std::numeric_limits<A>::is_iec559 == false"); + static_assert(std::numeric_limits<A>::is_bounded == false, + "std::numeric_limits<A>::is_bounded == false"); + static_assert(std::numeric_limits<A>::is_modulo == false, + "std::numeric_limits<A>::is_modulo == false"); + static_assert(std::numeric_limits<A>::traps == false, + "std::numeric_limits<A>::traps == false"); + static_assert(std::numeric_limits<A>::tinyness_before == false, + "std::numeric_limits<A>::tinyness_before == false"); + static_assert(std::numeric_limits<A>::round_style == std::round_toward_zero, + "std::numeric_limits<A>::round_style == std::round_toward_zero"); +} diff --git a/libcxx/test/language.support/support.limits/limits/numeric.special/nothing_to_do.pass.cpp b/libcxx/test/language.support/support.limits/limits/numeric.special/nothing_to_do.pass.cpp new file mode 100644 index 00000000000..fa4d462f18d --- /dev/null +++ b/libcxx/test/language.support/support.limits/limits/numeric.special/nothing_to_do.pass.cpp @@ -0,0 +1,12 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +int main() +{ +} diff --git a/libcxx/test/language.support/support.limits/limits/round.style/check_values.pass.cpp b/libcxx/test/language.support/support.limits/limits/round.style/check_values.pass.cpp new file mode 100644 index 00000000000..36299d7c07e --- /dev/null +++ b/libcxx/test/language.support/support.limits/limits/round.style/check_values.pass.cpp @@ -0,0 +1,34 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// test numeric_limits + +// float_denorm_style + +#include <limits> + +typedef char one; +struct two {one _[2];}; + +one test(std::float_denorm_style); +two test(int); + +int main() +{ + static_assert(std::denorm_indeterminate == -1, + "std::denorm_indeterminate == -1"); + static_assert(std::denorm_absent == 0, + "std::denorm_absent == 0"); + static_assert(std::denorm_present == 1, + "std::denorm_present == 1"); + static_assert(sizeof(test(std::denorm_present)) == 1, + "sizeof(test(std::denorm_present)) == 1"); + static_assert(sizeof(test(1)) == 2, + "sizeof(test(1)) == 2"); +} diff --git a/libcxx/test/language.support/support.limits/limits/version.pass.cpp b/libcxx/test/language.support/support.limits/limits/version.pass.cpp new file mode 100644 index 00000000000..5aa25cd9fd9 --- /dev/null +++ b/libcxx/test/language.support/support.limits/limits/version.pass.cpp @@ -0,0 +1,20 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <limits> + +#include <limits> + +#ifndef _LIBCPP_VERSION +#error _LIBCPP_VERSION not defined +#endif + +int main() +{ +} diff --git a/libcxx/test/language.support/support.limits/nothing_to_do.pass.cpp b/libcxx/test/language.support/support.limits/nothing_to_do.pass.cpp new file mode 100644 index 00000000000..fa4d462f18d --- /dev/null +++ b/libcxx/test/language.support/support.limits/nothing_to_do.pass.cpp @@ -0,0 +1,12 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +int main() +{ +} diff --git a/libcxx/test/language.support/support.rtti/bad.cast/bad_cast.pass.cpp b/libcxx/test/language.support/support.rtti/bad.cast/bad_cast.pass.cpp new file mode 100644 index 00000000000..a4ce4180402 --- /dev/null +++ b/libcxx/test/language.support/support.rtti/bad.cast/bad_cast.pass.cpp @@ -0,0 +1,27 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// test bad_cast + +#include <typeinfo> +#include <type_traits> +#include <cassert> + +int main() +{ + static_assert((std::is_base_of<std::exception, std::bad_cast>::value), + "std::is_base_of<std::exception, std::bad_cast>::value"); + static_assert(std::is_polymorphic<std::bad_cast>::value, + "std::is_polymorphic<std::bad_cast>::value"); + std::bad_cast b; + std::bad_cast b2 = b; + b2 = b; + const char* w = b2.what(); + assert(w); +} diff --git a/libcxx/test/language.support/support.rtti/bad.typeid/bad_typeid.pass.cpp b/libcxx/test/language.support/support.rtti/bad.typeid/bad_typeid.pass.cpp new file mode 100644 index 00000000000..7f4f818aa5b --- /dev/null +++ b/libcxx/test/language.support/support.rtti/bad.typeid/bad_typeid.pass.cpp @@ -0,0 +1,27 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// test bad_typeid + +#include <typeinfo> +#include <type_traits> +#include <cassert> + +int main() +{ + static_assert((std::is_base_of<std::exception, std::bad_typeid>::value), + "std::is_base_of<std::exception, std::bad_typeid>::value"); + static_assert(std::is_polymorphic<std::bad_typeid>::value, + "std::is_polymorphic<std::bad_typeid>::value"); + std::bad_typeid b; + std::bad_typeid b2 = b; + b2 = b; + const char* w = b2.what(); + assert(w); +} diff --git a/libcxx/test/language.support/support.rtti/type.info/type_info.pass.cpp b/libcxx/test/language.support/support.rtti/type.info/type_info.pass.cpp new file mode 100644 index 00000000000..d20f5243ac1 --- /dev/null +++ b/libcxx/test/language.support/support.rtti/type.info/type_info.pass.cpp @@ -0,0 +1,26 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// test type_info + +#include <typeinfo> +#include <cstring> +#include <cassert> + +int main() +{ + const std::type_info& t1 = typeid(int); + const std::type_info& t2 = typeid(int); + assert(t1 == t2); + const std::type_info& t3 = typeid(short); + assert(t1 != t3); + assert(!t1.before(t2)); + assert(strcmp(t1.name(), t2.name()) == 0); + assert(strcmp(t1.name(), t3.name()) != 0); +} diff --git a/libcxx/test/language.support/support.rtti/type.info/type_info_hash.pass.cpp b/libcxx/test/language.support/support.rtti/type.info/type_info_hash.pass.cpp new file mode 100644 index 00000000000..00178e1c719 --- /dev/null +++ b/libcxx/test/language.support/support.rtti/type.info/type_info_hash.pass.cpp @@ -0,0 +1,23 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// test type_info + +#include <typeinfo> +#include <cstring> +#include <cassert> + +int main() +{ + const std::type_info& t1 = typeid(int); + const std::type_info& t2 = typeid(int); + const std::type_info& t3 = typeid(short); + assert(t1.hash_code() == t2.hash_code()); + assert(t1.hash_code() != t3.hash_code()); +} diff --git a/libcxx/test/language.support/support.rtti/version.pass.cpp b/libcxx/test/language.support/support.rtti/version.pass.cpp new file mode 100644 index 00000000000..cd8fdaf259d --- /dev/null +++ b/libcxx/test/language.support/support.rtti/version.pass.cpp @@ -0,0 +1,20 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <typeinfo> + +#include <typeinfo> + +#ifndef _LIBCPP_VERSION +#error _LIBCPP_VERSION not defined +#endif + +int main() +{ +} diff --git a/libcxx/test/language.support/support.runtime/csetjmp.pass.cpp b/libcxx/test/language.support/support.runtime/csetjmp.pass.cpp new file mode 100644 index 00000000000..c57bab986a3 --- /dev/null +++ b/libcxx/test/language.support/support.runtime/csetjmp.pass.cpp @@ -0,0 +1,24 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// test <csetjmp> + +#include <csetjmp> +#include <type_traits> + +#ifndef setjmp +#error setjmp not defined +#endif + +int main() +{ + std::jmp_buf jb; + static_assert((std::is_same<__typeof__(std::longjmp(jb, 0)), void>::value), + "std::is_same<__typeof__(std::longjmp(jb, 0)), void>::value"); +} diff --git a/libcxx/test/language.support/support.runtime/csignal.pass.cpp b/libcxx/test/language.support/support.runtime/csignal.pass.cpp new file mode 100644 index 00000000000..0dcabb0e53e --- /dev/null +++ b/libcxx/test/language.support/support.runtime/csignal.pass.cpp @@ -0,0 +1,57 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// test <csignal> + +#include <csignal> +#include <type_traits> + +#ifndef SIG_DFL +#error SIG_DFL not defined +#endif + +#ifndef SIG_ERR +#error SIG_ERR not defined +#endif + +#ifndef SIG_IGN +#error SIG_IGN not defined +#endif + +#ifndef SIGABRT +#error SIGABRT not defined +#endif + +#ifndef SIGFPE +#error SIGFPE not defined +#endif + +#ifndef SIGILL +#error SIGILL not defined +#endif + +#ifndef SIGINT +#error SIGINT not defined +#endif + +#ifndef SIGSEGV +#error SIGSEGV not defined +#endif + +#ifndef SIGTERM +#error SIGTERM not defined +#endif + +int main() +{ + std::sig_atomic_t sig; + typedef void (*func)(int); + static_assert((std::is_same<decltype(std::signal(0, (func)0)), func>::value), ""); + static_assert((std::is_same<decltype(std::raise(0)), int>::value), ""); +} diff --git a/libcxx/test/language.support/support.runtime/cstdarg.pass.cpp b/libcxx/test/language.support/support.runtime/cstdarg.pass.cpp new file mode 100644 index 00000000000..f25bdb6a82d --- /dev/null +++ b/libcxx/test/language.support/support.runtime/cstdarg.pass.cpp @@ -0,0 +1,33 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// test <cstdarg> + +#include <cstdarg> + +#ifndef va_arg +#error va_arg not defined +#endif + +#ifndef va_copy +#error va_copy not defined +#endif + +#ifndef va_end +#error va_end not defined +#endif + +#ifndef va_start +#error va_start not defined +#endif + +int main() +{ + std::va_list va; +} diff --git a/libcxx/test/language.support/support.runtime/cstdbool.pass.cpp b/libcxx/test/language.support/support.runtime/cstdbool.pass.cpp new file mode 100644 index 00000000000..7d4dcd25a71 --- /dev/null +++ b/libcxx/test/language.support/support.runtime/cstdbool.pass.cpp @@ -0,0 +1,32 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// test <cstdbool> + +#include <cstdbool> + +#ifndef __bool_true_false_are_defined +#error __bool_true_false_are_defined not defined +#endif + +#ifdef bool +#error bool should not be defined +#endif + +#ifdef true +#error true should not be defined +#endif + +#ifdef false +#error false should not be defined +#endif + +int main() +{ +} diff --git a/libcxx/test/language.support/support.runtime/cstdlib.pass.cpp b/libcxx/test/language.support/support.runtime/cstdlib.pass.cpp new file mode 100644 index 00000000000..3e42f8c8fc9 --- /dev/null +++ b/libcxx/test/language.support/support.runtime/cstdlib.pass.cpp @@ -0,0 +1,86 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// test <cstdlib> + +#include <cstdlib> +#include <type_traits> + +#ifndef EXIT_FAILURE +#error EXIT_FAILURE not defined +#endif + +#ifndef EXIT_SUCCESS +#error EXIT_SUCCESS not defined +#endif + +#ifndef MB_CUR_MAX +#error MB_CUR_MAX not defined +#endif + +#ifndef NULL +#error NULL not defined +#endif + +#ifndef RAND_MAX +#error RAND_MAX not defined +#endif + +int main() +{ + std::size_t s = 0; + std::div_t d; + std::ldiv_t ld; + std::lldiv_t lld; + char** endptr = 0; + static_assert((std::is_same<decltype(std::atof("")), double>::value), ""); + static_assert((std::is_same<decltype(std::atoi("")), int>::value), ""); + static_assert((std::is_same<decltype(std::atol("")), long>::value), ""); + static_assert((std::is_same<decltype(std::atoll("")), long long>::value), ""); + static_assert((std::is_same<decltype(std::getenv("")), char*>::value), ""); + static_assert((std::is_same<decltype(std::strtod("", endptr)), double>::value), ""); + static_assert((std::is_same<decltype(std::strtof("", endptr)), float>::value), ""); + static_assert((std::is_same<decltype(std::strtold("", endptr)), long double>::value), ""); + static_assert((std::is_same<decltype(std::strtol("", endptr,0)), long>::value), ""); + static_assert((std::is_same<decltype(std::strtoll("", endptr,0)), long long>::value), ""); + static_assert((std::is_same<decltype(std::strtoul("", endptr,0)), unsigned long>::value), ""); + static_assert((std::is_same<decltype(std::strtoull("", endptr,0)), unsigned long long>::value), ""); + static_assert((std::is_same<decltype(std::rand()), int>::value), ""); + static_assert((std::is_same<decltype(std::srand(0)), void>::value), ""); + static_assert((std::is_same<decltype(std::calloc(0,0)), void*>::value), ""); + static_assert((std::is_same<decltype(std::free(0)), void>::value), ""); + static_assert((std::is_same<decltype(std::malloc(0)), void*>::value), ""); + static_assert((std::is_same<decltype(std::realloc(0,0)), void*>::value), ""); + static_assert((std::is_same<decltype(std::abort()), void>::value), ""); + static_assert((std::is_same<decltype(std::atexit(0)), int>::value), ""); + static_assert((std::is_same<decltype(std::exit(0)), void>::value), ""); + static_assert((std::is_same<decltype(std::_Exit(0)), void>::value), ""); + static_assert((std::is_same<decltype(std::getenv("")), char*>::value), ""); + static_assert((std::is_same<decltype(std::system("")), int>::value), ""); + static_assert((std::is_same<decltype(std::bsearch(0,0,0,0,0)), void*>::value), ""); + static_assert((std::is_same<decltype(std::qsort(0,0,0,0)), void>::value), ""); + static_assert((std::is_same<decltype(std::abs(0)), int>::value), ""); + static_assert((std::is_same<decltype(std::abs((long)0)), long>::value), ""); + static_assert((std::is_same<decltype(std::abs((long long)0)), long long>::value), ""); + static_assert((std::is_same<decltype(std::labs((long)0)), long>::value), ""); + static_assert((std::is_same<decltype(std::llabs((long long)0)), long long>::value), ""); + static_assert((std::is_same<decltype(std::div(0,0)), std::div_t>::value), ""); + static_assert((std::is_same<decltype(std::div(0L,0L)), std::ldiv_t>::value), ""); + static_assert((std::is_same<decltype(std::div(0LL,0LL)), std::lldiv_t>::value), ""); + static_assert((std::is_same<decltype(std::ldiv(0L,0L)), std::ldiv_t>::value), ""); + static_assert((std::is_same<decltype(std::lldiv(0LL,0LL)), std::lldiv_t>::value), ""); + static_assert((std::is_same<decltype(std::mblen("",0)), int>::value), ""); + wchar_t* pw = 0; + const wchar_t* pwc = 0; + char* pc = 0; + static_assert((std::is_same<decltype(std::mbtowc(pw,"",0)), int>::value), ""); + static_assert((std::is_same<decltype(std::wctomb(pc,L' ')), int>::value), ""); + static_assert((std::is_same<decltype(std::mbstowcs(pw,"",0)), std::size_t>::value), ""); + static_assert((std::is_same<decltype(std::wcstombs(pc,pwc,0)), std::size_t>::value), ""); +} diff --git a/libcxx/test/language.support/support.runtime/ctime.pass.cpp b/libcxx/test/language.support/support.runtime/ctime.pass.cpp new file mode 100644 index 00000000000..4b205762ecc --- /dev/null +++ b/libcxx/test/language.support/support.runtime/ctime.pass.cpp @@ -0,0 +1,40 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// test <ctime> + +#include <ctime> +#include <type_traits> + +#ifndef NULL +#error NULL not defined +#endif + +#ifndef CLOCKS_PER_SEC +#error CLOCKS_PER_SEC not defined +#endif + +int main() +{ + std::clock_t c = 0; + std::size_t s = 0; + std::time_t t = 0; + std::tm tm = {0}; + static_assert((std::is_same<decltype(std::clock()), std::clock_t>::value), ""); + static_assert((std::is_same<decltype(std::difftime(t,t)), double>::value), ""); + static_assert((std::is_same<decltype(std::mktime(&tm)), std::time_t>::value), ""); + static_assert((std::is_same<decltype(std::time(&t)), std::time_t>::value), ""); + static_assert((std::is_same<decltype(std::asctime(&tm)), char*>::value), ""); + static_assert((std::is_same<decltype(std::ctime(&t)), char*>::value), ""); + static_assert((std::is_same<decltype(std::gmtime(&t)), std::tm*>::value), ""); + static_assert((std::is_same<decltype(std::localtime(&t)), std::tm*>::value), ""); + char* c1 = 0; + const char* c2 = 0; + static_assert((std::is_same<decltype(std::strftime(c1,s,c2,&tm)), std::size_t>::value), ""); +} diff --git a/libcxx/test/language.support/support.runtime/version_csetjmp.pass.cpp b/libcxx/test/language.support/support.runtime/version_csetjmp.pass.cpp new file mode 100644 index 00000000000..6607f7d5bac --- /dev/null +++ b/libcxx/test/language.support/support.runtime/version_csetjmp.pass.cpp @@ -0,0 +1,20 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <csetjmp> + +#include <csetjmp> + +#ifndef _LIBCPP_VERSION +#error _LIBCPP_VERSION not defined +#endif + +int main() +{ +} diff --git a/libcxx/test/language.support/support.runtime/version_csignal.pass.cpp b/libcxx/test/language.support/support.runtime/version_csignal.pass.cpp new file mode 100644 index 00000000000..5d4a38eb9bd --- /dev/null +++ b/libcxx/test/language.support/support.runtime/version_csignal.pass.cpp @@ -0,0 +1,20 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <csignal> + +#include <csignal> + +#ifndef _LIBCPP_VERSION +#error _LIBCPP_VERSION not defined +#endif + +int main() +{ +} diff --git a/libcxx/test/language.support/support.runtime/version_cstdarg.pass.cpp b/libcxx/test/language.support/support.runtime/version_cstdarg.pass.cpp new file mode 100644 index 00000000000..16e2e9e099e --- /dev/null +++ b/libcxx/test/language.support/support.runtime/version_cstdarg.pass.cpp @@ -0,0 +1,20 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <cstdarg> + +#include <cstdarg> + +#ifndef _LIBCPP_VERSION +#error _LIBCPP_VERSION not defined +#endif + +int main() +{ +} diff --git a/libcxx/test/language.support/support.runtime/version_cstdbool.pass.cpp b/libcxx/test/language.support/support.runtime/version_cstdbool.pass.cpp new file mode 100644 index 00000000000..2eab23b4436 --- /dev/null +++ b/libcxx/test/language.support/support.runtime/version_cstdbool.pass.cpp @@ -0,0 +1,20 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <cstdbool> + +#include <cstdbool> + +#ifndef _LIBCPP_VERSION +#error _LIBCPP_VERSION not defined +#endif + +int main() +{ +} diff --git a/libcxx/test/language.support/support.runtime/version_cstdlib.pass.cpp b/libcxx/test/language.support/support.runtime/version_cstdlib.pass.cpp new file mode 100644 index 00000000000..7de716942fc --- /dev/null +++ b/libcxx/test/language.support/support.runtime/version_cstdlib.pass.cpp @@ -0,0 +1,20 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <cstdlib> + +#include <cstdlib> + +#ifndef _LIBCPP_VERSION +#error _LIBCPP_VERSION not defined +#endif + +int main() +{ +} diff --git a/libcxx/test/language.support/support.runtime/version_ctime.pass.cpp b/libcxx/test/language.support/support.runtime/version_ctime.pass.cpp new file mode 100644 index 00000000000..659d85e8be3 --- /dev/null +++ b/libcxx/test/language.support/support.runtime/version_ctime.pass.cpp @@ -0,0 +1,20 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <ctime> + +#include <ctime> + +#ifndef _LIBCPP_VERSION +#error _LIBCPP_VERSION not defined +#endif + +int main() +{ +} diff --git a/libcxx/test/language.support/support.start.term/quick_exit.pass.cpp b/libcxx/test/language.support/support.start.term/quick_exit.pass.cpp new file mode 100644 index 00000000000..aa474c17e6e --- /dev/null +++ b/libcxx/test/language.support/support.start.term/quick_exit.pass.cpp @@ -0,0 +1,21 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// test quick_exit and at_quick_exit + +#include <cstdlib> +#include <type_traits> + +void f(); + +int main() +{ + std::at_quick_exit(f); + quick_exit(0); +} diff --git a/libcxx/test/language.support/support.types/max_align_t.pass.cpp b/libcxx/test/language.support/support.types/max_align_t.pass.cpp new file mode 100644 index 00000000000..d9a0d980251 --- /dev/null +++ b/libcxx/test/language.support/support.types/max_align_t.pass.cpp @@ -0,0 +1,34 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include <cstddef> +#include <type_traits> + +// max_align_t is a POD type whose alignment requirement is at least as +// great as that of every scalar type + +#include <stdio.h> + +int main() +{ + static_assert(std::is_pod<std::max_align_t>::value, + "std::is_pod<std::max_align_t>::value"); + static_assert((std::alignment_of<std::max_align_t>::value >= + std::alignment_of<long long>::value), + "std::alignment_of<std::max_align_t>::value >= " + "std::alignment_of<long long>::value"); + static_assert(std::alignment_of<std::max_align_t>::value >= + std::alignment_of<long double>::value, + "std::alignment_of<std::max_align_t>::value >= " + "std::alignment_of<long double>::value"); + static_assert(std::alignment_of<std::max_align_t>::value >= + std::alignment_of<void*>::value, + "std::alignment_of<std::max_align_t>::value >= " + "std::alignment_of<void*>::value"); +} diff --git a/libcxx/test/language.support/support.types/null.pass.cpp b/libcxx/test/language.support/support.types/null.pass.cpp new file mode 100644 index 00000000000..563b61685cb --- /dev/null +++ b/libcxx/test/language.support/support.types/null.pass.cpp @@ -0,0 +1,18 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include <cstddef> + +#ifndef NULL +#error NULL not defined +#endif + +int main() +{ +} diff --git a/libcxx/test/language.support/support.types/nullptr_t.pass.cpp b/libcxx/test/language.support/support.types/nullptr_t.pass.cpp new file mode 100644 index 00000000000..ec1059b26d1 --- /dev/null +++ b/libcxx/test/language.support/support.types/nullptr_t.pass.cpp @@ -0,0 +1,44 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include <cstddef> +#include <type_traits> +#include <cassert> + +// typedef decltype(nullptr) nullptr_t; + +struct A +{ + A(std::nullptr_t) {} +}; + +int main() +{ + static_assert(sizeof(std::nullptr_t) == sizeof(void*), + "sizeof(std::nullptr_t) == sizeof(void*)"); + A* p = 0; + assert(p == nullptr); + void (A::*pmf)() = 0; +#ifdef __clang__ + // GCC 4.2 can't handle this + assert(pmf == nullptr); +#endif + int A::*pmd = 0; + assert(pmd == nullptr); + A a1(nullptr); + A a2(0); + bool b = nullptr; + assert(!b); + assert(nullptr == nullptr); + assert(nullptr <= nullptr); + assert(nullptr >= nullptr); + assert(!(nullptr != nullptr)); + assert(!(nullptr < nullptr)); + assert(!(nullptr > nullptr)); +} diff --git a/libcxx/test/language.support/support.types/offsetof.pass.cpp b/libcxx/test/language.support/support.types/offsetof.pass.cpp new file mode 100644 index 00000000000..b551ea5dec1 --- /dev/null +++ b/libcxx/test/language.support/support.types/offsetof.pass.cpp @@ -0,0 +1,18 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include <cstddef> + +#ifndef offsetof +#error offsetof not defined +#endif + +int main() +{ +} diff --git a/libcxx/test/language.support/support.types/ptrdiff_t.pass.cpp b/libcxx/test/language.support/support.types/ptrdiff_t.pass.cpp new file mode 100644 index 00000000000..cffef945378 --- /dev/null +++ b/libcxx/test/language.support/support.types/ptrdiff_t.pass.cpp @@ -0,0 +1,27 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include <cstddef> +#include <type_traits> + +// ptrdiff_t should: + +// 1. be in namespace std. +// 2. be the same sizeof as void*. +// 3. be a signed integral. + +int main() +{ + static_assert(sizeof(std::ptrdiff_t) == sizeof(void*), + "sizeof(std::ptrdiff_t) == sizeof(void*)"); + static_assert(std::is_signed<std::ptrdiff_t>::value, + "std::is_signed<std::ptrdiff_t>::value"); + static_assert(std::is_integral<std::ptrdiff_t>::value, + "std::is_integral<std::ptrdiff_t>::value"); +} diff --git a/libcxx/test/language.support/support.types/size_t.pass.cpp b/libcxx/test/language.support/support.types/size_t.pass.cpp new file mode 100644 index 00000000000..d8de688fccd --- /dev/null +++ b/libcxx/test/language.support/support.types/size_t.pass.cpp @@ -0,0 +1,27 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include <cstddef> +#include <type_traits> + +// size_t should: + +// 1. be in namespace std. +// 2. be the same sizeof as void*. +// 3. be an unsigned integral. + +int main() +{ + static_assert(sizeof(std::size_t) == sizeof(void*), + "sizeof(std::size_t) == sizeof(void*)"); + static_assert(std::is_unsigned<std::size_t>::value, + "std::is_unsigned<std::size_t>::value"); + static_assert(std::is_integral<std::size_t>::value, + "std::is_integral<std::size_t>::value"); +} diff --git a/libcxx/test/language.support/support.types/version.pass.cpp b/libcxx/test/language.support/support.types/version.pass.cpp new file mode 100644 index 00000000000..8eb0a1c62e2 --- /dev/null +++ b/libcxx/test/language.support/support.types/version.pass.cpp @@ -0,0 +1,20 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <cstddef> + +#include <cstddef> + +#ifndef _LIBCPP_VERSION +#error _LIBCPP_VERSION not defined +#endif + +int main() +{ +} |