diff options
author | Dmitri Gribenko <gribozavr@gmail.com> | 2015-02-24 01:06:22 +0000 |
---|---|---|
committer | Dmitri Gribenko <gribozavr@gmail.com> | 2015-02-24 01:06:22 +0000 |
commit | 8e51c4da267677c458c1021374ab69223921c015 (patch) | |
tree | 4f3bcc29addbfe68cebf8cd677164d315996af5a /test/Headers/x86_64-apple-macosx-types.cpp | |
parent | 9c4b255d03d29db66d0eb5dfc775b34e9efe3531 (diff) |
Restore the libc++ definition of max_align_t on Apple platforms
Clang has introduced ::max_align_t in stddef.h in r201729, but libc++ was
already defining std::max_align_t on Darwin because there was none in the
global namespace. After that Clang commit though, libc++ started defining
std::max_align_t to be a typedef for ::max_align_t, which has a different
definition. This changed the ABI. This commit restores the previous
definition.
rdar://19919394 rdar://18557982
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@230292 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/Headers/x86_64-apple-macosx-types.cpp')
-rw-r--r-- | test/Headers/x86_64-apple-macosx-types.cpp | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/test/Headers/x86_64-apple-macosx-types.cpp b/test/Headers/x86_64-apple-macosx-types.cpp new file mode 100644 index 0000000000..7cbff6e033 --- /dev/null +++ b/test/Headers/x86_64-apple-macosx-types.cpp @@ -0,0 +1,83 @@ +// RUN: %clang_cc1 -triple x86_64-apple-macosx10.9 -std=c++11 -verify %s +// expected-no-diagnostics + +struct true_type { + static constexpr const bool value = true; +}; + +struct false_type { + static constexpr const bool value = false; +}; + +template <class _Tp, class _Up> struct is_same : public false_type {}; +template <class _Tp> struct is_same<_Tp, _Tp> : public true_type {}; + +// Check that our 'is_same' works. +static_assert(is_same<char, char>::value, "is_same is broken"); +static_assert(!is_same<char, char *>::value, "is_same is broken"); + +template <class _Tp, unsigned _AlignOf, unsigned _SizeOf> +struct check_type { + static constexpr const bool value = + (alignof(_Tp) == _AlignOf) && (sizeof(_Tp) == _SizeOf); +}; + +//===----------------------------------------------------------------------===// +// Fundamental types +//===----------------------------------------------------------------------===// + +static_assert(check_type<bool, 1, 1>::value, "bool is wrong"); + +static_assert(check_type<char, 1, 1>::value, "char is wrong"); +static_assert(check_type<signed char, 1, 1>::value, "signed char is wrong"); +static_assert(check_type<unsigned char, 1, 1>::value, "unsigned char is wrong"); + +static_assert(check_type<char16_t, 2, 2>::value, "char16_t is wrong"); +static_assert(check_type<char32_t, 4, 4>::value, "char32_t is wrong"); +static_assert(check_type<wchar_t, 4, 4>::value, "wchar_t is wrong"); + +static_assert(check_type<short, 2, 2>::value, "short is wrong"); +static_assert(check_type<unsigned short, 2, 2>::value, "unsigned short is wrong"); + +static_assert(check_type<int, 4, 4>::value, "int is wrong"); +static_assert(check_type<unsigned int, 4, 4>::value, "unsigned int is wrong"); + +static_assert(check_type<long, 8, 8>::value, "long is wrong"); +static_assert(check_type<unsigned long, 8, 8>::value, "unsigned long is wrong"); + +static_assert(check_type<long long, 8, 8>::value, "long long is wrong"); +static_assert(check_type<unsigned long long, 8, 8>::value, "unsigned long long is wrong"); + +static_assert(check_type<float, 4, 4>::value, "float is wrong"); +static_assert(check_type<double, 8, 8>::value, "double is wrong"); +static_assert(check_type<long double, 16, 16>::value, "long double is wrong"); + +static_assert(check_type<void *, 8, 8>::value, "'void *' is wrong"); +static_assert(check_type<int (*)(int), 8, 8>::value, "function pointer is wrong"); + +//===----------------------------------------------------------------------===// +// stdarg.h +//===----------------------------------------------------------------------===// + +#include <stdarg.h> + +static_assert(check_type<va_list, 8, 24>::value, "va_list is wrong"); + +//===----------------------------------------------------------------------===// +// stddef.h +//===----------------------------------------------------------------------===// + +#define __STDC_WANT_LIB_EXT1__ 1 +#include <stddef.h> + +static_assert(is_same<long int, ::ptrdiff_t>::value, "::ptrdiff_t is wrong"); +static_assert(is_same<decltype(sizeof(char)), ::size_t>::value, "::size_t is wrong"); +static_assert(is_same<long unsigned int, ::size_t>::value, "::size_t is wrong"); +static_assert(is_same<long unsigned int, ::rsize_t>::value, "::rsize_t is wrong"); +static_assert(is_same<long double, ::max_align_t>::value, "::max_align_t is wrong"); + +#define __need_wint_t +#include <stddef.h> + +static_assert(is_same<int, ::wint_t>::value, "::wint_t is wrong"); + |