diff options
author | Dimitry Andric <dim@FreeBSD.org> | 2020-07-31 21:22:58 +0000 |
---|---|---|
committer | Dimitry Andric <dim@FreeBSD.org> | 2020-07-31 21:22:58 +0000 |
commit | 5ffd83dbcc34f10e07f6d3e968ae6365869615f4 (patch) | |
tree | 0e9f5cf729dde39f949698fddef45a34e2bc7f44 /contrib/llvm-project/libcxx/include/cstddef | |
parent | 1799696096df87b52968b8996d00c91e0a5de8d9 (diff) | |
parent | cfca06d7963fa0909f90483b42a6d7d194d01e08 (diff) | |
download | src-5ffd83dbcc34f10e07f6d3e968ae6365869615f4.tar.gz src-5ffd83dbcc34f10e07f6d3e968ae6365869615f4.zip |
Merge llvm, clang, compiler-rt, libc++, libunwind, lld, lldb and openmp
master 2e10b7a39b9, the last commit before the llvmorg-12-init tag, from
which release/11.x was branched.
Note that for now, I rolled back all our local changes to make merging
easier, and I will reapply the still-relevant ones after updating to
11.0.0-rc1.
Notes
Notes:
svn path=/projects/clang1100-import/; revision=363742
Diffstat (limited to 'contrib/llvm-project/libcxx/include/cstddef')
-rw-r--r-- | contrib/llvm-project/libcxx/include/cstddef | 64 |
1 files changed, 56 insertions, 8 deletions
diff --git a/contrib/llvm-project/libcxx/include/cstddef b/contrib/llvm-project/libcxx/include/cstddef index bd62d6db39e8..2a0bfeb6e15f 100644 --- a/contrib/llvm-project/libcxx/include/cstddef +++ b/contrib/llvm-project/libcxx/include/cstddef @@ -25,7 +25,7 @@ Types: ptrdiff_t size_t - max_align_t + max_align_t // C++11 nullptr_t byte // C++17 @@ -49,12 +49,34 @@ _LIBCPP_BEGIN_NAMESPACE_STD using ::ptrdiff_t; using ::size_t; -#if defined(__CLANG_MAX_ALIGN_T_DEFINED) || defined(_GCC_MAX_ALIGN_T) || \ - defined(__DEFINED_max_align_t) || defined(__NetBSD__) -// Re-use the compiler's <stddef.h> max_align_t where possible. +#if !defined(_LIBCPP_CXX03_LANG) using ::max_align_t; -#else -typedef long double max_align_t; +#endif + +template <class _Tp> struct __libcpp_is_integral { enum { value = 0 }; }; +template <> struct __libcpp_is_integral<bool> { enum { value = 1 }; }; +template <> struct __libcpp_is_integral<char> { enum { value = 1 }; }; +template <> struct __libcpp_is_integral<signed char> { enum { value = 1 }; }; +template <> struct __libcpp_is_integral<unsigned char> { enum { value = 1 }; }; +template <> struct __libcpp_is_integral<wchar_t> { enum { value = 1 }; }; +#ifndef _LIBCPP_NO_HAS_CHAR8_T +template <> struct __libcpp_is_integral<char8_t> { enum { value = 1 }; }; +#endif +#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS +template <> struct __libcpp_is_integral<char16_t> { enum { value = 1 }; }; +template <> struct __libcpp_is_integral<char32_t> { enum { value = 1 }; }; +#endif // _LIBCPP_HAS_NO_UNICODE_CHARS +template <> struct __libcpp_is_integral<short> { enum { value = 1 }; }; +template <> struct __libcpp_is_integral<unsigned short> { enum { value = 1 }; }; +template <> struct __libcpp_is_integral<int> { enum { value = 1 }; }; +template <> struct __libcpp_is_integral<unsigned int> { enum { value = 1 }; }; +template <> struct __libcpp_is_integral<long> { enum { value = 1 }; }; +template <> struct __libcpp_is_integral<unsigned long> { enum { value = 1 }; }; +template <> struct __libcpp_is_integral<long long> { enum { value = 1 }; }; +template <> struct __libcpp_is_integral<unsigned long long> { enum { value = 1 }; }; +#ifndef _LIBCPP_HAS_NO_INT128 +template <> struct __libcpp_is_integral<__int128_t> { enum { value = 1 }; }; +template <> struct __libcpp_is_integral<__uint128_t> { enum { value = 1 }; }; #endif _LIBCPP_END_NAMESPACE_STD @@ -64,6 +86,11 @@ namespace std // purposefully not versioned { enum class byte : unsigned char {}; + +template <bool> struct __enable_if_integral_imp {}; +template <> struct __enable_if_integral_imp<true> { using type = byte; }; +template <class _Tp> using _EnableByteOverload = typename __enable_if_integral_imp<__libcpp_is_integral<_Tp>::value>::type; + constexpr byte operator| (byte __lhs, byte __rhs) noexcept { return static_cast<byte>( @@ -104,10 +131,31 @@ constexpr byte operator~ (byte __b) noexcept ~static_cast<unsigned int>(__b) )); } - +template <class _Integer> + constexpr _EnableByteOverload<_Integer> & + operator<<=(byte& __lhs, _Integer __shift) noexcept + { return __lhs = __lhs << __shift; } + +template <class _Integer> + constexpr _EnableByteOverload<_Integer> + operator<< (byte __lhs, _Integer __shift) noexcept + { return static_cast<byte>(static_cast<unsigned char>(static_cast<unsigned int>(__lhs) << __shift)); } + +template <class _Integer> + constexpr _EnableByteOverload<_Integer> & + operator>>=(byte& __lhs, _Integer __shift) noexcept + { return __lhs = __lhs >> __shift; } + +template <class _Integer> + constexpr _EnableByteOverload<_Integer> + operator>> (byte __lhs, _Integer __shift) noexcept + { return static_cast<byte>(static_cast<unsigned char>(static_cast<unsigned int>(__lhs) >> __shift)); } + +template <class _Integer, class = _EnableByteOverload<_Integer> > + constexpr _Integer + to_integer(byte __b) noexcept { return static_cast<_Integer>(__b); } } -#include <type_traits> // rest of byte #endif #endif // _LIBCPP_CSTDDEF |