diff --git a/src/libc/include/stddef.h b/src/libc/include/stddef.h index 6613331d1..72b90e5c7 100644 --- a/src/libc/include/stddef.h +++ b/src/libc/include/stddef.h @@ -14,6 +14,7 @@ typedef __WCHAR_TYPE__ wchar_t; #endif /* __cplusplus */ #endif /* _WCHAR_T_DEFINED */ +#if __STDC_VERSION__ >= 199901L || __cplusplus >= 201103L typedef struct { long long __max_align_ll __attribute__((__aligned__(__alignof__( long long)))); long double __max_align_ld __attribute__((__aligned__(__alignof__(long double)))); @@ -21,5 +22,6 @@ typedef struct { __float128 __max_align_f128 __attribute__((__aligned__(__alignof__( __float128)))); #endif } max_align_t; +#endif /* __STDC_VERSION__ >= 199901L || __cplusplus >= 201103L */ #endif /* _STDDEF_H */ diff --git a/src/libcxx/abort_message.h b/src/libcxx/abort_message.h index dc72ac26e..1a2b5f936 100644 --- a/src/libcxx/abort_message.h +++ b/src/libcxx/abort_message.h @@ -20,6 +20,7 @@ __BEGIN_DECLS void __abort_message(const char *) __attribute__((noreturn)); __END_DECLS -__END_DECLS + +} // namespace std #endif // _EZCXX_ABORT_MESSAGE_H diff --git a/src/libcxx/header_test.cpp b/src/libcxx/header_test.cpp index 208470c48..6b348704d 100644 --- a/src/libcxx/header_test.cpp +++ b/src/libcxx/header_test.cpp @@ -15,6 +15,7 @@ #endif // __cplusplus >= 201907L #include #include +#include #include #include #include diff --git a/src/libcxx/include/__abs_overloads b/src/libcxx/include/__abs_overloads index c7c279d89..e4e8518c1 100644 --- a/src/libcxx/include/__abs_overloads +++ b/src/libcxx/include/__abs_overloads @@ -1,54 +1,54 @@ -// -*- C++ -*- -#ifndef _EZCXX_ABS_OVERLOADS -#define _EZCXX_ABS_OVERLOADS - -#include - -#pragma clang system_header - -// https://cplusplus.github.io/LWG/issue2192 - -#ifndef _ABS_INT_DEFINED -#define _ABS_INT_DEFINED - -__BEGIN_DECLS - -int abs(int n); -long labs(long n); -long long llabs(long long n); - -#ifdef __SIZEOF_INT48__ -signed __int48 i48abs(signed __int48 n) __NOEXCEPT_CONST; -#endif // __SIZEOF_INT48__ - -__END_DECLS - -#endif // _ABS_INT_DEFINED - -#ifndef _ABS_FLOAT_DEFINED -#define _ABS_FLOAT_DEFINED - -extern "C" { - float fabsf(float); - double fabs(double); - long double fabsl(long double); -} // extern "C" - -#endif // _ABS_FLOAT_DEFINED - -namespace std { -using ::abs; -inline constexpr long abs(long __x) { return labs(__x); } -inline constexpr long long abs(long long __x) { return llabs(__x); } - -#ifdef __SIZEOF_INT48__ -using ::i48abs; -inline signed __int48 abs(signed __int48 __x) { return i48abs(__x); } -#endif // __SIZEOF_INT48__ - -inline constexpr float abs(float __x) { return fabsf(__x); } -inline constexpr double abs(double __x) { return fabs(__x); } -inline constexpr long double abs(long double __x) { return fabsl(__x); } -} - -#endif // _EZCXX_ABS_OVERLOADS +// -*- C++ -*- +#ifndef _EZCXX_ABS_OVERLOADS +#define _EZCXX_ABS_OVERLOADS + +#include + +#pragma clang system_header + +// https://cplusplus.github.io/LWG/issue2192 + +#ifndef _ABS_INT_DEFINED +#define _ABS_INT_DEFINED + +__BEGIN_DECLS + +int abs(int n); +long labs(long n); +long long llabs(long long n); + +#ifdef __SIZEOF_INT48__ +signed __int48 i48abs(signed __int48 n) __NOEXCEPT_CONST; +#endif // __SIZEOF_INT48__ + +__END_DECLS + +#endif // _ABS_INT_DEFINED + +#ifndef _ABS_FLOAT_DEFINED +#define _ABS_FLOAT_DEFINED + +extern "C" { + float fabsf(float); + double fabs(double); + long double fabsl(long double); +} // extern "C" + +#endif // _ABS_FLOAT_DEFINED + +namespace std { +using ::abs; +inline constexpr long abs(long __x) { return labs(__x); } +inline constexpr long long abs(long long __x) { return llabs(__x); } + +#ifdef __SIZEOF_INT48__ +using ::i48abs; +inline signed __int48 abs(signed __int48 __x) { return i48abs(__x); } +#endif // __SIZEOF_INT48__ + +inline constexpr float abs(float __x) { return fabsf(__x); } +inline constexpr double abs(double __x) { return fabs(__x); } +inline constexpr long double abs(long double __x) { return fabsl(__x); } +} + +#endif // _EZCXX_ABS_OVERLOADS diff --git a/src/libcxx/include/cmath b/src/libcxx/include/cmath index ccd658ae3..d29fe3cec 100644 --- a/src/libcxx/include/cmath +++ b/src/libcxx/include/cmath @@ -637,7 +637,7 @@ using ::nextupl; inline float nextup(float __x) { return nextupf(__x); } inline long double nextup(long double __x) { return nextupl(__x); } template inline -__cmath_enable_if_t<__cmath_is_integral_v<_Tp>, double> +__cmath_enable_if_t<__cmath_is_integral_v<_Tp>, double> nextup(_Tp __x) { return nextup(__x); } using ::nexttoward; @@ -655,7 +655,7 @@ using ::nextdownl; inline float nextdown(float __x) { return nextdownf(__x); } inline long double nextdown(long double __x) { return nextdownl(__x); } template inline -__cmath_enable_if_t<__cmath_is_integral_v<_Tp>, double> +__cmath_enable_if_t<__cmath_is_integral_v<_Tp>, double> nextdown(_Tp __x) { return nextdown(__x); } using ::pow; diff --git a/src/libcxx/include/cstdarg b/src/libcxx/include/cstdarg new file mode 100644 index 000000000..00194d79c --- /dev/null +++ b/src/libcxx/include/cstdarg @@ -0,0 +1,15 @@ +// -*- C++ -*- +#ifndef _EZCXX_CSTDARG +#define _EZCXX_CSTDARG + +#include + +#pragma clang system_header + +namespace std { + +using ::va_list; + +} // namespace std + +#endif // _EZCXX_CSTDARG diff --git a/src/libcxx/include/cstddef b/src/libcxx/include/cstddef index b0e2ac61d..202203a08 100644 --- a/src/libcxx/include/cstddef +++ b/src/libcxx/include/cstddef @@ -10,9 +10,13 @@ namespace std { using ::ptrdiff_t; using ::size_t; + +#if __cplusplus >= 201103L using ::max_align_t; using nullptr_t = decltype(nullptr); +#endif /* __cplusplus >= 201103L */ +#if __cplusplus >= 201703L enum class byte : unsigned char {}; constexpr byte operator| (byte __lhs, byte __rhs) noexcept { return byte(char(__lhs) | char(__rhs)); } @@ -22,6 +26,7 @@ constexpr byte& operator&=(byte& __lhs, byte __rhs) noexcept { return __lhs = __ constexpr byte operator^ (byte __lhs, byte __rhs) noexcept { return byte(char(__lhs) ^ char(__rhs)); } constexpr byte& operator^=(byte& __lhs, byte __rhs) noexcept { return __lhs = __lhs ^ __rhs; } constexpr byte operator~ (byte __rhs) noexcept { return byte(~char(__rhs)); } +#endif /* __cplusplus >= 201703L */ } // namespace std diff --git a/src/libcxx/include/cstdint b/src/libcxx/include/cstdint index 39cd41e3c..3988ee5be 100644 --- a/src/libcxx/include/cstdint +++ b/src/libcxx/include/cstdint @@ -7,45 +7,45 @@ #pragma clang system_header namespace std { -using::int8_t; -using::int16_t; -using::int24_t; -using::int32_t; -using::int48_t; -using::int64_t; - -using::uint8_t; -using::uint16_t; -using::uint24_t; -using::uint32_t; -using::uint48_t; -using::uint64_t; - -using::int_least8_t; -using::int_least16_t; -using::int_least32_t; -using::int_least64_t; - -using::uint_least8_t; -using::uint_least16_t; -using::uint_least32_t; -using::uint_least64_t; - -using::int_fast8_t; -using::int_fast16_t; -using::int_fast32_t; -using::int_fast64_t; - -using::uint_fast8_t; -using::uint_fast16_t; -using::uint_fast32_t; -using::uint_fast64_t; - -using::intptr_t; -using::uintptr_t; - -using::intmax_t; -using::uintmax_t; +using ::int8_t; +using ::int16_t; +using ::int24_t; +using ::int32_t; +using ::int48_t; +using ::int64_t; + +using ::uint8_t; +using ::uint16_t; +using ::uint24_t; +using ::uint32_t; +using ::uint48_t; +using ::uint64_t; + +using ::int_least8_t; +using ::int_least16_t; +using ::int_least32_t; +using ::int_least64_t; + +using ::uint_least8_t; +using ::uint_least16_t; +using ::uint_least32_t; +using ::uint_least64_t; + +using ::int_fast8_t; +using ::int_fast16_t; +using ::int_fast32_t; +using ::int_fast64_t; + +using ::uint_fast8_t; +using ::uint_fast16_t; +using ::uint_fast32_t; +using ::uint_fast64_t; + +using ::intptr_t; +using ::uintptr_t; + +using ::intmax_t; +using ::uintmax_t; } // namespace std #endif // _EZCXX_CSTDINT diff --git a/src/libcxx/include/memory b/src/libcxx/include/memory index 8d49ecca7..b2d2eb66d 100644 --- a/src/libcxx/include/memory +++ b/src/libcxx/include/memory @@ -1,19 +1,19 @@ -// -*- C++ -*- -#ifndef _EZCXX_MEMORY -#define _EZCXX_MEMORY - -#pragma clang system_header - -namespace std { - -template -constexpr inline _Tp* addressof(_Tp& __x) noexcept { - return __builtin_addressof(__x); -} - -template -_Tp* addressof(const _Tp&&) noexcept = delete; - -} // namespace std - -#endif // _EZCXX_MEMORY +// -*- C++ -*- +#ifndef _EZCXX_MEMORY +#define _EZCXX_MEMORY + +#pragma clang system_header + +namespace std { + +template +constexpr inline _Tp* addressof(_Tp& __x) noexcept { + return __builtin_addressof(__x); +} + +template +_Tp* addressof(const _Tp&&) noexcept = delete; + +} // namespace std + +#endif // _EZCXX_MEMORY diff --git a/src/libcxx/include/numbers b/src/libcxx/include/numbers index f7c5d5736..09266a8f9 100644 --- a/src/libcxx/include/numbers +++ b/src/libcxx/include/numbers @@ -13,7 +13,7 @@ #include #if __cplusplus >= 201907L - #include + #include #endif #pragma clang system_header @@ -31,10 +31,10 @@ inline constexpr bool __false = false; template struct __illformed { - static_assert( - __false<_Tp>, - "A program that instantiates a primary template of a mathematical constant variable template is ill-formed." - ); + static_assert( + __false<_Tp>, + "A program that instantiates a primary template of a mathematical constant variable template is ill-formed." + ); }; template diff --git a/src/libcxx/include/source_location b/src/libcxx/include/source_location index 6be127d42..1836aaeb7 100644 --- a/src/libcxx/include/source_location +++ b/src/libcxx/include/source_location @@ -1,63 +1,63 @@ -// -*- C++ -*- -//===----------------------------------------------------------------------===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#ifndef _EZCXX_SOURCE_LOCATION -#define _EZCXX_SOURCE_LOCATION - -#include <__config> -#include - -#pragma clang system_header - -namespace std { - -class source_location { - // The names source_location::__impl, _M_file_name, _M_function_name, _M_line, and _M_column - // are hard-coded in the compiler and must not be changed here. - struct __impl { - const char* _M_file_name; - const char* _M_function_name; - unsigned _M_line; - unsigned _M_column; - }; - const __impl* __ptr_ = nullptr; - // GCC returns the type 'const void*' from the builtin, while clang returns - // `const __impl*`. Per C++ [expr.const], casts from void* are not permitted - // in constant evaluation, so we don't want to use `void*` as the argument - // type unless the builtin returned that, anyhow, and the invalid cast is - // unavoidable. - using __bsl_ty _EZCXX_NODEBUG = decltype(__builtin_source_location()); - -public: - // The defaulted __ptr argument is necessary so that the builtin is evaluated - // in the context of the caller. An explicit value should never be provided. - static consteval source_location current(__bsl_ty __ptr = __builtin_source_location()) noexcept { - source_location __sl; - __sl.__ptr_ = static_cast(__ptr); - return __sl; - } - _EZCXX_HIDE_FROM_ABI constexpr source_location() noexcept = default; - - _EZCXX_HIDE_FROM_ABI constexpr uint_least32_t line() const noexcept { - return __ptr_ != nullptr ? __ptr_->_M_line : 0; - } - _EZCXX_HIDE_FROM_ABI constexpr uint_least32_t column() const noexcept { - return __ptr_ != nullptr ? __ptr_->_M_column : 0; - } - _EZCXX_HIDE_FROM_ABI constexpr const char* file_name() const noexcept { - return __ptr_ != nullptr ? __ptr_->_M_file_name : ""; - } - _EZCXX_HIDE_FROM_ABI constexpr const char* function_name() const noexcept { - return __ptr_ != nullptr ? __ptr_->_M_function_name : ""; - } -}; - -} // namespace std - -#endif // _EZCXX_SOURCE_LOCATION +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _EZCXX_SOURCE_LOCATION +#define _EZCXX_SOURCE_LOCATION + +#include <__config> +#include + +#pragma clang system_header + +namespace std { + +class source_location { + // The names source_location::__impl, _M_file_name, _M_function_name, _M_line, and _M_column + // are hard-coded in the compiler and must not be changed here. + struct __impl { + const char* _M_file_name; + const char* _M_function_name; + unsigned _M_line; + unsigned _M_column; + }; + const __impl* __ptr_ = nullptr; + // GCC returns the type 'const void*' from the builtin, while clang returns + // `const __impl*`. Per C++ [expr.const], casts from void* are not permitted + // in constant evaluation, so we don't want to use `void*` as the argument + // type unless the builtin returned that, anyhow, and the invalid cast is + // unavoidable. + using __bsl_ty _EZCXX_NODEBUG = decltype(__builtin_source_location()); + +public: + // The defaulted __ptr argument is necessary so that the builtin is evaluated + // in the context of the caller. An explicit value should never be provided. + static consteval source_location current(__bsl_ty __ptr = __builtin_source_location()) noexcept { + source_location __sl; + __sl.__ptr_ = static_cast(__ptr); + return __sl; + } + _EZCXX_HIDE_FROM_ABI constexpr source_location() noexcept = default; + + _EZCXX_HIDE_FROM_ABI constexpr uint_least32_t line() const noexcept { + return __ptr_ != nullptr ? __ptr_->_M_line : 0; + } + _EZCXX_HIDE_FROM_ABI constexpr uint_least32_t column() const noexcept { + return __ptr_ != nullptr ? __ptr_->_M_column : 0; + } + _EZCXX_HIDE_FROM_ABI constexpr const char* file_name() const noexcept { + return __ptr_ != nullptr ? __ptr_->_M_file_name : ""; + } + _EZCXX_HIDE_FROM_ABI constexpr const char* function_name() const noexcept { + return __ptr_ != nullptr ? __ptr_->_M_function_name : ""; + } +}; + +} // namespace std + +#endif // _EZCXX_SOURCE_LOCATION diff --git a/src/libcxx/include/type_traits b/src/libcxx/include/type_traits index 10ffe2949..90b1f39f7 100644 --- a/src/libcxx/include/type_traits +++ b/src/libcxx/include/type_traits @@ -296,12 +296,12 @@ template using is_unsigned = bool_constant>; // const/volatile addition traits //------------------------------------------------------------------------------ -template using add_const = conditional, is_function<_Tp>, is_const<_Tp>>, - _Tp, _Tp const>; +template using add_const = + conditional, is_function<_Tp>, is_const<_Tp>>, _Tp, _Tp const>; template using add_const_t = typename add_const<_Tp>::type; -template using add_volatile = conditional, is_function<_Tp>, is_volatile<_Tp>>, - _Tp, _Tp volatile>; +template using add_volatile = + conditional, is_function<_Tp>, is_volatile<_Tp>>, _Tp, _Tp volatile>; template using add_volatile_t = typename add_volatile<_Tp>::type; template using add_cv = add_const>; @@ -382,16 +382,28 @@ template struct remove_all_extents<_Tp[]> { typedef typename remove_a template struct remove_all_extents<_Tp[_Np]> { typedef typename remove_all_extents<_Tp>::type type; }; template using remove_all_extents_t = typename remove_all_extents<_Tp>::type; +template +struct is_bounded_array: false_type {}; +template +struct is_bounded_array<_Tp[_N]> : true_type {}; +template inline constexpr bool is_bounded_array_v = is_bounded_array<_Tp>::value; + +template +struct is_unbounded_array: false_type {}; +template +struct is_unbounded_array<_Tp[]> : true_type {}; +template inline constexpr bool is_unbounded_array_v = is_unbounded_array<_Tp>::value; + // decay: template struct decay { private: typedef typename std::remove_reference<_Tp>::type _Up; public: - typedef typename std::conditional< + typedef typename std::conditional< std::is_array<_Up>::value, typename std::add_pointer::type>::type, - typename std::conditional< + typename std::conditional< std::is_function<_Up>::value, typename std::add_pointer<_Up>::type, typename std::remove_cv<_Up>::type @@ -475,21 +487,28 @@ template auto __nt_assignable(...) -> false_type; template using is_nothrow_assignable = decltype(__nt_assignable<_Lp, _Rp>(0)); template inline constexpr bool is_nothrow_assignable_v = is_nothrow_assignable<_Lp, _Rp>::value; -template using is_copy_assignable = is_assignable, - add_lvalue_reference_t>>; - +template using is_copy_assignable = + is_assignable, add_lvalue_reference_t>>; template inline constexpr bool is_copy_assignable_v = is_copy_assignable<_Tp>::value; -template using is_nothrow_copy_assignable = is_nothrow_assignable, - add_lvalue_reference_t>>; +template struct is_trivially_copy_assignable + : public is_trivially_assignable, add_lvalue_reference_t>> {}; +template inline constexpr bool is_trivially_copy_assignable_v = is_trivially_copy_assignable<_Tp>::value; + +template using is_nothrow_copy_assignable = + is_nothrow_assignable, add_lvalue_reference_t>>; template inline constexpr bool is_nothrow_copy_assignable_v = is_nothrow_copy_assignable<_Tp>::value; -template using is_move_assignable = is_assignable, - add_rvalue_reference_t<_Tp>>; +template using is_move_assignable = + is_assignable, add_rvalue_reference_t<_Tp>>; template inline constexpr bool is_move_assignable_v = is_move_assignable<_Tp>::value; -template using is_nothrow_move_assignable = is_nothrow_assignable, - add_rvalue_reference_t<_Tp>>; +template struct is_trivially_move_assignable + : public is_trivially_assignable, add_rvalue_reference_t<_Tp>> {}; +template inline constexpr bool is_trivially_move_assignable_v = is_trivially_move_assignable<_Tp>::value; + +template using is_nothrow_move_assignable = + is_nothrow_assignable, add_rvalue_reference_t<_Tp>>; template inline constexpr bool is_nothrow_move_assignable_v = is_nothrow_move_assignable<_Tp>::value; /* Clang 16.0.0 required */ @@ -499,7 +518,7 @@ template inline constexpr bool is_destructible_v = __is_destructible( template using is_destructible = bool_constant>; #endif #elif __cplusplus >= 201907L -template struct is_destructible +template struct is_destructible : std::integral_constant {}; template inline constexpr bool is_destructible_v = is_destructible<_Tp>::value; @@ -517,7 +536,7 @@ template inline constexpr bool is_nothrow_destructible_v = __is_nothr template using is_nothrow_destructible = bool_constant>; #endif #elif __cplusplus >= 201907L -template struct is_nothrow_destructible +template struct is_nothrow_destructible : std::integral_constant {}; template inline constexpr bool is_nothrow_destructible_v = is_nothrow_destructible<_Tp>::value; @@ -542,26 +561,26 @@ inline constexpr bool is_constant_evaluated() noexcept { template struct __copy_cv { - template - using __apply _EZCXX_NODEBUG = _To; + template + using __apply _EZCXX_NODEBUG = _To; }; template struct __copy_cv { - template - using __apply _EZCXX_NODEBUG = const _To; + template + using __apply _EZCXX_NODEBUG = const _To; }; template struct __copy_cv { - template - using __apply _EZCXX_NODEBUG = volatile _To; + template + using __apply _EZCXX_NODEBUG = volatile _To; }; template struct __copy_cv { - template - using __apply _EZCXX_NODEBUG = const volatile _To; + template + using __apply _EZCXX_NODEBUG = const volatile _To; }; template @@ -571,20 +590,20 @@ using __copy_cv_t _EZCXX_NODEBUG = typename __copy_cv<_From>::template __apply<_ template struct __copy_cvref { - template - using __apply _EZCXX_NODEBUG = __copy_cv_t<_From, _To>; + template + using __apply _EZCXX_NODEBUG = __copy_cv_t<_From, _To>; }; template struct __copy_cvref<_From&> { - template - using __apply _EZCXX_NODEBUG = add_lvalue_reference_t<__copy_cv_t<_From, _To> >; + template + using __apply _EZCXX_NODEBUG = add_lvalue_reference_t<__copy_cv_t<_From, _To> >; }; template struct __copy_cvref<_From&&> { - template - using __apply _EZCXX_NODEBUG = add_rvalue_reference_t<__copy_cv_t<_From, _To> >; + template + using __apply _EZCXX_NODEBUG = add_rvalue_reference_t<__copy_cv_t<_From, _To> >; }; template @@ -600,7 +619,7 @@ struct __type_list_head; template struct __type_list_head<__type_list<_Head, _Tail...> > { - using type _EZCXX_NODEBUG = _Head; + using type _EZCXX_NODEBUG = _Head; }; template ::type)> @@ -608,12 +627,12 @@ struct __find_first; template struct __find_first<__type_list<_Head, _Tail...>, _Size, true> { - using type _EZCXX_NODEBUG = _Head; + using type _EZCXX_NODEBUG = _Head; }; template struct __find_first<__type_list<_Head, _Tail...>, _Size, false> { - using type _EZCXX_NODEBUG = typename __find_first<__type_list<_Tail...>, _Size>::type; + using type _EZCXX_NODEBUG = typename __find_first<__type_list<_Tail...>, _Size>::type; }; // nat @@ -662,7 +681,7 @@ struct __ezcxx_make_unsigned{}; template struct __ezcxx_make_unsigned<_Tp, true> { - typedef typename __find_first<__unsigned_types, sizeof(_Tp)>::type type; + typedef typename __find_first<__unsigned_types, sizeof(_Tp)>::type type; }; template <> struct __ezcxx_make_unsigned {}; @@ -724,7 +743,7 @@ struct __common_type3 {}; // sub-bullet 4 - "if COND_RES(CREF(D1), CREF(D2)) denotes a type..." template struct __common_type3<_Tp, _Up, void_t<__cond_type>> { - using type _EZCXX_NODEBUG = remove_cvref_t<__cond_type>; + using type _EZCXX_NODEBUG = remove_cvref_t<__cond_type>; }; template @@ -736,7 +755,7 @@ struct __common_type2_imp {}; template struct __common_type2_imp<_Tp, _Up, void_t() : std::declval<_Up>())> > { - using type _EZCXX_NODEBUG = decay_t() : std::declval<_Up>())>; + using type _EZCXX_NODEBUG = decay_t() : std::declval<_Up>())>; }; template @@ -749,7 +768,7 @@ struct _EZCXX_TEMPLATE_VIS common_type; template struct __common_type_impl< __common_types<_Tp, _Up>, void_t::type> > { - typedef typename common_type<_Tp, _Up>::type type; + typedef typename common_type<_Tp, _Up>::type type; }; template @@ -789,8 +808,8 @@ using __cond_res _EZCXX_NODEBUG = decltype(false ? std::declval<_Xp (&)()>()() : // [Note: `XREF(A)` is `__xref::template __apply`] template struct __xref { - template - using __apply _EZCXX_NODEBUG = __copy_cvref_t<_Tp, _Up>; + template + using __apply _EZCXX_NODEBUG = __copy_cvref_t<_Tp, _Up>; }; // Given types A and B, let X be remove_reference_t, let Y be remove_reference_t, @@ -808,11 +827,10 @@ using __cv_cond_res _EZCXX_NODEBUG = __cond_res<__copy_cv_t<_Xp, _Yp>&, __copy_c // COND-RES(COPYCV(X, Y)&, COPYCV(Y, X)&) if that type exists and is a reference type. // clang-format off template - requires - requires { typename __cv_cond_res<_Xp, _Yp>; } && + requires requires { typename __cv_cond_res<_Xp, _Yp>; } && is_reference_v<__cv_cond_res<_Xp, _Yp>> struct __common_ref<_Ap&, _Bp&, _Xp, _Yp> { - using __type _EZCXX_NODEBUG = __cv_cond_res<_Xp, _Yp>; + using __type _EZCXX_NODEBUG = __cv_cond_res<_Xp, _Yp>; }; // clang-format on @@ -824,12 +842,11 @@ using __common_ref_C _EZCXX_NODEBUG = remove_reference_t<__common_ref_t<_Xp&, _Y // is_convertible_v && is_convertible_v is true, then COMMON-REF(A, B) is C. // clang-format off template - requires - requires { typename __common_ref_C<_Xp, _Yp>; } && + requires requires { typename __common_ref_C<_Xp, _Yp>; } && is_convertible_v<_Ap&&, __common_ref_C<_Xp, _Yp>> && is_convertible_v<_Bp&&, __common_ref_C<_Xp, _Yp>> struct __common_ref<_Ap&&, _Bp&&, _Xp, _Yp> { - using __type _EZCXX_NODEBUG = __common_ref_C<_Xp, _Yp>; + using __type _EZCXX_NODEBUG = __common_ref_C<_Xp, _Yp>; }; // clang-format on @@ -841,11 +858,10 @@ using __common_ref_D _EZCXX_NODEBUG = __common_ref_t; // is_convertible_v is true, then COMMON-REF(A, B) is D. // clang-format off template - requires - requires { typename __common_ref_D<_Xp, _Yp>; } && + requires requires { typename __common_ref_D<_Xp, _Yp>; } && is_convertible_v<_Ap&&, __common_ref_D<_Xp, _Yp>> struct __common_ref<_Ap&&, _Bp&, _Xp, _Yp> { - using __type _EZCXX_NODEBUG = __common_ref_D<_Xp, _Yp>; + using __type _EZCXX_NODEBUG = __common_ref_D<_Xp, _Yp>; }; // clang-format on @@ -873,7 +889,7 @@ struct common_reference<> {}; // bullet 2 - sizeof...(T) == 1 template struct common_reference<_Tp> { - using type _EZCXX_NODEBUG = _Tp; + using type _EZCXX_NODEBUG = _Tp; }; // bullet 3 - sizeof...(T) == 2 @@ -890,9 +906,9 @@ template struct common_reference<_Tp, _Up> : __common_reference_sub_bullet1<_Tp, _Up> {}; template - requires is_reference_v<_Tp> && is_reference_v<_Up> && requires { typename __common_ref_t<_Tp, _Up>; } + requires is_reference_v<_Tp> && is_reference_v<_Up> && requires { typename __common_ref_t<_Tp, _Up>; } struct __common_reference_sub_bullet1<_Tp, _Up> { - using type _EZCXX_NODEBUG = __common_ref_t<_Tp, _Up>; + using type _EZCXX_NODEBUG = __common_ref_t<_Tp, _Up>; }; // sub-bullet 2 - Otherwise, if basic_common_reference, remove_cvref_t, XREF(T1), XREF(T2)>::type @@ -902,23 +918,25 @@ struct basic_common_reference {}; template using __basic_common_reference_t _EZCXX_NODEBUG = - typename basic_common_reference, - remove_cvref_t<_Up>, - __xref<_Tp>::template __apply, - __xref<_Up>::template __apply>::type; + typename basic_common_reference< + remove_cvref_t<_Tp>, + remove_cvref_t<_Up>, + __xref<_Tp>::template __apply, + __xref<_Up>::template __apply + >::type; template - requires requires { typename __basic_common_reference_t<_Tp, _Up>; } + requires requires { typename __basic_common_reference_t<_Tp, _Up>; } struct __common_reference_sub_bullet2<_Tp, _Up> { - using type _EZCXX_NODEBUG = __basic_common_reference_t<_Tp, _Up>; + using type _EZCXX_NODEBUG = __basic_common_reference_t<_Tp, _Up>; }; // sub-bullet 3 - Otherwise, if COND-RES(T1, T2) is well-formed, // then the member typedef `type` denotes that type. template - requires requires { typename __cond_res<_Tp, _Up>; } + requires requires { typename __cond_res<_Tp, _Up>; } struct __common_reference_sub_bullet3<_Tp, _Up> { - using type _EZCXX_NODEBUG = __cond_res<_Tp, _Up>; + using type _EZCXX_NODEBUG = __cond_res<_Tp, _Up>; }; // sub-bullet 4 & 5 - Otherwise, if common_type_t is well-formed, @@ -930,7 +948,7 @@ struct __common_reference_sub_bullet3 : common_type<_Tp, _Up> {}; // bullet 4 - If there is such a type `C`, the member typedef type shall denote the same type, if // any, as `common_reference_t`. template - requires requires { typename common_reference_t<_Tp, _Up>; } + requires requires { typename common_reference_t<_Tp, _Up>; } struct common_reference<_Tp, _Up, _Vp, _Rest...> : common_reference, _Vp, _Rest...> {}; // bullet 5 - Otherwise, there shall be no member `type`. @@ -946,8 +964,8 @@ struct common_reference {}; template _EZCXX_NODISCARD _EZCXX_INLINE constexpr remove_reference_t<_Tp>&& move(_EZCXX_LIFETIMEBOUND _Tp&& __t) noexcept { - using _Up _EZCXX_NODEBUG = remove_reference_t<_Tp>; - return static_cast<_Up&&>(__t); + using _Up _EZCXX_NODEBUG = remove_reference_t<_Tp>; + return static_cast<_Up&&>(__t); } template diff --git a/src/libcxx/include/version b/src/libcxx/include/version index 67a14fb09..68989219c 100644 --- a/src/libcxx/include/version +++ b/src/libcxx/include/version @@ -103,7 +103,7 @@ // # define __cpp_lib_bind_front 201907L # define __cpp_lib_bit_cast 201806L # define __cpp_lib_bitops 201907L -// # define __cpp_lib_bounded_array_traits 201902L +# define __cpp_lib_bounded_array_traits 201902L // # define __cpp_lib_char8_t 201907L // # define __cpp_lib_concepts 202002L // # define __cpp_lib_constexpr_algorithms 201806L diff --git a/src/libcxx/makefile b/src/libcxx/makefile index 795b9aebe..3355046f7 100644 --- a/src/libcxx/makefile +++ b/src/libcxx/makefile @@ -47,4 +47,3 @@ install: all $(Q)$(call COPY,$(foreach file,$(call NATIVEPATH,$(WILDCARD_H)),$(call QUOTE_ARG,$(file))),$(INSTALL_CXX_H)) .PHONY: all clean - diff --git a/src/libcxx/math_test.cpp b/src/libcxx/math_test.cpp index 52f71ab92..70ceafe62 100644 --- a/src/libcxx/math_test.cpp +++ b/src/libcxx/math_test.cpp @@ -1,682 +1,682 @@ -#include -#include -#include -#include -#include -#include -#include - -#define C(expr) static_assert(expr, #expr) - -// can't get issignaling to work at compile time at the moment -#define issignaling(...) true || true - -//------------------------------------------------------------------------------ -// Positive value tests -//------------------------------------------------------------------------------ - -/* ZERO */ - -C((!signbit (0.0f))); -C((!issignaling(0.0f))); -C((!isnan (0.0f))); -C((!isinf (0.0f))); -C(( isfinite (0.0f))); -C((!isnormal (0.0f))); -C((!issubnormal(0.0f))); -C(( iszero (0.0f))); - -C((!signbit (0.0))); -C((!issignaling(0.0))); -C((!isnan (0.0))); -C((!isinf (0.0))); -C(( isfinite (0.0))); -C((!isnormal (0.0))); -C((!issubnormal(0.0))); -C(( iszero (0.0))); - -C((!signbit (0.0L))); -C((!issignaling(0.0L))); -C((!isnan (0.0L))); -C((!isinf (0.0L))); -C(( isfinite (0.0L))); -C((!isnormal (0.0L))); -C((!issubnormal(0.0L))); -C(( iszero (0.0L))); - -/* TRUE_MIN */ - -C((!signbit (std::numeric_limits::denorm_min()))); -C((!issignaling(std::numeric_limits::denorm_min()))); -C((!isnan (std::numeric_limits::denorm_min()))); -C((!isinf (std::numeric_limits::denorm_min()))); -C(( isfinite (std::numeric_limits::denorm_min()))); -C((!isnormal (std::numeric_limits::denorm_min()))); -C(( issubnormal(std::numeric_limits::denorm_min()))); -C((!iszero (std::numeric_limits::denorm_min()))); - -C((!signbit (std::numeric_limits::denorm_min()))); -C((!issignaling(std::numeric_limits::denorm_min()))); -C((!isnan (std::numeric_limits::denorm_min()))); -C((!isinf (std::numeric_limits::denorm_min()))); -C(( isfinite (std::numeric_limits::denorm_min()))); -C((!isnormal (std::numeric_limits::denorm_min()))); -C(( issubnormal(std::numeric_limits::denorm_min()))); -C((!iszero (std::numeric_limits::denorm_min()))); - -C((!signbit (std::numeric_limits::denorm_min()))); -C((!issignaling(std::numeric_limits::denorm_min()))); -C((!isnan (std::numeric_limits::denorm_min()))); -C((!isinf (std::numeric_limits::denorm_min()))); -C(( isfinite (std::numeric_limits::denorm_min()))); -C((!isnormal (std::numeric_limits::denorm_min()))); -C(( issubnormal(std::numeric_limits::denorm_min()))); -C((!iszero (std::numeric_limits::denorm_min()))); - -/* MIN */ - -C((!signbit (std::numeric_limits::min()))); -C((!issignaling(std::numeric_limits::min()))); -C((!isnan (std::numeric_limits::min()))); -C((!isinf (std::numeric_limits::min()))); -C(( isfinite (std::numeric_limits::min()))); -C(( isnormal (std::numeric_limits::min()))); -C((!issubnormal(std::numeric_limits::min()))); -C((!iszero (std::numeric_limits::min()))); - -C((!signbit (std::numeric_limits::min()))); -C((!issignaling(std::numeric_limits::min()))); -C((!isnan (std::numeric_limits::min()))); -C((!isinf (std::numeric_limits::min()))); -C(( isfinite (std::numeric_limits::min()))); -C(( isnormal (std::numeric_limits::min()))); -C((!issubnormal(std::numeric_limits::min()))); -C((!iszero (std::numeric_limits::min()))); - -C((!signbit (std::numeric_limits::min()))); -C((!issignaling(std::numeric_limits::min()))); -C((!isnan (std::numeric_limits::min()))); -C((!isinf (std::numeric_limits::min()))); -C(( isfinite (std::numeric_limits::min()))); -C(( isnormal (std::numeric_limits::min()))); -C((!issubnormal(std::numeric_limits::min()))); -C((!iszero (std::numeric_limits::min()))); - -/* RECIP PI */ - -C((!signbit (0.31830988618379067153776752674503f))); -C((!issignaling(0.31830988618379067153776752674503f))); -C((!isnan (0.31830988618379067153776752674503f))); -C((!isinf (0.31830988618379067153776752674503f))); -C(( isfinite (0.31830988618379067153776752674503f))); -C(( isnormal (0.31830988618379067153776752674503f))); -C((!issubnormal(0.31830988618379067153776752674503f))); -C((!iszero (0.31830988618379067153776752674503f))); - -C((!signbit (0.31830988618379067153776752674503))); -C((!issignaling(0.31830988618379067153776752674503))); -C((!isnan (0.31830988618379067153776752674503))); -C((!isinf (0.31830988618379067153776752674503))); -C(( isfinite (0.31830988618379067153776752674503))); -C(( isnormal (0.31830988618379067153776752674503))); -C((!issubnormal(0.31830988618379067153776752674503))); -C((!iszero (0.31830988618379067153776752674503))); - -C((!signbit (0.31830988618379067153776752674503L))); -C((!issignaling(0.31830988618379067153776752674503L))); -C((!isnan (0.31830988618379067153776752674503L))); -C((!isinf (0.31830988618379067153776752674503L))); -C(( isfinite (0.31830988618379067153776752674503L))); -C(( isnormal (0.31830988618379067153776752674503L))); -C((!issubnormal(0.31830988618379067153776752674503L))); -C((!iszero (0.31830988618379067153776752674503L))); - -/* ONE */ - -C((!signbit (1.0f))); -C((!issignaling(1.0f))); -C((!isnan (1.0f))); -C((!isinf (1.0f))); -C(( isfinite (1.0f))); -C(( isnormal (1.0f))); -C((!issubnormal(1.0f))); -C((!iszero (1.0f))); - -C((!signbit (1.0))); -C((!issignaling(1.0))); -C((!isnan (1.0))); -C((!isinf (1.0))); -C(( isfinite (1.0))); -C(( isnormal (1.0))); -C((!issubnormal(1.0))); -C((!iszero (1.0))); - -C((!signbit (1.0L))); -C((!issignaling(1.0L))); -C((!isnan (1.0L))); -C((!isinf (1.0L))); -C(( isfinite (1.0L))); -C(( isnormal (1.0L))); -C((!issubnormal(1.0L))); -C((!iszero (1.0L))); - -/* PI */ - -C((!signbit (3.1415926535897932384626433832795f))); -C((!issignaling(3.1415926535897932384626433832795f))); -C((!isnan (3.1415926535897932384626433832795f))); -C((!isinf (3.1415926535897932384626433832795f))); -C(( isfinite (3.1415926535897932384626433832795f))); -C(( isnormal (3.1415926535897932384626433832795f))); -C((!issubnormal(3.1415926535897932384626433832795f))); -C((!iszero (3.1415926535897932384626433832795f))); - -C((!signbit (3.1415926535897932384626433832795))); -C((!issignaling(3.1415926535897932384626433832795))); -C((!isnan (3.1415926535897932384626433832795))); -C((!isinf (3.1415926535897932384626433832795))); -C(( isfinite (3.1415926535897932384626433832795))); -C(( isnormal (3.1415926535897932384626433832795))); -C((!issubnormal(3.1415926535897932384626433832795))); -C((!iszero (3.1415926535897932384626433832795))); - -C((!signbit (3.1415926535897932384626433832795L))); -C((!issignaling(3.1415926535897932384626433832795L))); -C((!isnan (3.1415926535897932384626433832795L))); -C((!isinf (3.1415926535897932384626433832795L))); -C(( isfinite (3.1415926535897932384626433832795L))); -C(( isnormal (3.1415926535897932384626433832795L))); -C((!issubnormal(3.1415926535897932384626433832795L))); -C((!iszero (3.1415926535897932384626433832795L))); - -/* MAX */ - -C((!signbit (std::numeric_limits::max()))); -C((!issignaling(std::numeric_limits::max()))); -C((!isnan (std::numeric_limits::max()))); -C((!isinf (std::numeric_limits::max()))); -C(( isfinite (std::numeric_limits::max()))); -C(( isnormal (std::numeric_limits::max()))); -C((!issubnormal(std::numeric_limits::max()))); -C((!iszero (std::numeric_limits::max()))); - -C((!signbit (std::numeric_limits::max()))); -C((!issignaling(std::numeric_limits::max()))); -C((!isnan (std::numeric_limits::max()))); -C((!isinf (std::numeric_limits::max()))); -C(( isfinite (std::numeric_limits::max()))); -C(( isnormal (std::numeric_limits::max()))); -C((!issubnormal(std::numeric_limits::max()))); -C((!iszero (std::numeric_limits::max()))); - -C((!signbit (std::numeric_limits::max()))); -C((!issignaling(std::numeric_limits::max()))); -C((!isnan (std::numeric_limits::max()))); -C((!isinf (std::numeric_limits::max()))); -C(( isfinite (std::numeric_limits::max()))); -C(( isnormal (std::numeric_limits::max()))); -C((!issubnormal(std::numeric_limits::max()))); -C((!iszero (std::numeric_limits::max()))); - -/* INFINITY */ - -C((!signbit (__builtin_inff()))); -C((!issignaling(__builtin_inff()))); -C((!isnan (__builtin_inff()))); -C(( isinf (__builtin_inff()))); -C((!isfinite (__builtin_inff()))); -C((!isnormal (__builtin_inff()))); -C((!issubnormal(__builtin_inff()))); -C((!iszero (__builtin_inff()))); - -C((!signbit (__builtin_inf()))); -C((!issignaling(__builtin_inf()))); -C((!isnan (__builtin_inf()))); -C(( isinf (__builtin_inf()))); -C((!isfinite (__builtin_inf()))); -C((!isnormal (__builtin_inf()))); -C((!issubnormal(__builtin_inf()))); -C((!iszero (__builtin_inf()))); - -C((!signbit (__builtin_infl()))); -C((!issignaling(__builtin_infl()))); -C((!isnan (__builtin_infl()))); -C(( isinf (__builtin_infl()))); -C((!isfinite (__builtin_infl()))); -C((!isnormal (__builtin_infl()))); -C((!issubnormal(__builtin_infl()))); -C((!iszero (__builtin_infl()))); - -/* NAN */ - -C((!signbit (__builtin_nanf("")))); -C(( issignaling(__builtin_nanf("")))); -C(( isnan (__builtin_nanf("")))); -C((!isinf (__builtin_nanf("")))); -C((!isfinite (__builtin_nanf("")))); -C((!isnormal (__builtin_nanf("")))); -C((!issubnormal(__builtin_nanf("")))); -C((!iszero (__builtin_nanf("")))); - -C((!signbit (__builtin_nan("")))); -C(( issignaling(__builtin_nan("")))); -C(( isnan (__builtin_nan("")))); -C((!isinf (__builtin_nan("")))); -C((!isfinite (__builtin_nan("")))); -C((!isnormal (__builtin_nan("")))); -C((!issubnormal(__builtin_nan("")))); -C((!iszero (__builtin_nan("")))); - -C((!signbit (__builtin_nanl("")))); -C(( issignaling(__builtin_nanl("")))); -C(( isnan (__builtin_nanl("")))); -C((!isinf (__builtin_nanl("")))); -C((!isfinite (__builtin_nanl("")))); -C((!isnormal (__builtin_nanl("")))); -C((!issubnormal(__builtin_nanl("")))); -C((!iszero (__builtin_nanl("")))); - -/* SIGNALING NAN */ - -C((!signbit (__builtin_nansf("")))); -C(( issignaling(__builtin_nansf("")))); -C(( isnan (__builtin_nansf("")))); -C((!isinf (__builtin_nansf("")))); -C((!isfinite (__builtin_nansf("")))); -C((!isnormal (__builtin_nansf("")))); -C((!issubnormal(__builtin_nansf("")))); -C((!iszero (__builtin_nansf("")))); - -C((!signbit (__builtin_nans("")))); -C(( issignaling(__builtin_nans("")))); -C(( isnan (__builtin_nans("")))); -C((!isinf (__builtin_nans("")))); -C((!isfinite (__builtin_nans("")))); -C((!isnormal (__builtin_nans("")))); -C((!issubnormal(__builtin_nans("")))); -C((!iszero (__builtin_nans("")))); - -C((!signbit (__builtin_nansl("")))); -C(( issignaling(__builtin_nansl("")))); -C(( isnan (__builtin_nansl("")))); -C((!isinf (__builtin_nansl("")))); -C((!isfinite (__builtin_nansl("")))); -C((!isnormal (__builtin_nansl("")))); -C((!issubnormal(__builtin_nansl("")))); -C((!iszero (__builtin_nansl("")))); - -//------------------------------------------------------------------------------ -// Negative value tests -//------------------------------------------------------------------------------ - -/* ZERO */ - -C(( signbit (-0.0f))); -C((!issignaling(-0.0f))); -C((!isnan (-0.0f))); -C((!isinf (-0.0f))); -C(( isfinite (-0.0f))); -C((!isnormal (-0.0f))); -C((!issubnormal(-0.0f))); -C(( iszero (-0.0f))); - -C(( signbit (-0.0))); -C((!issignaling(-0.0))); -C((!isnan (-0.0))); -C((!isinf (-0.0))); -C(( isfinite (-0.0))); -C((!isnormal (-0.0))); -C((!issubnormal(-0.0))); -C(( iszero (-0.0))); - -C(( signbit (-0.0L))); -C((!issignaling(-0.0L))); -C((!isnan (-0.0L))); -C((!isinf (-0.0L))); -C(( isfinite (-0.0L))); -C((!isnormal (-0.0L))); -C((!issubnormal(-0.0L))); -C(( iszero (-0.0L))); - -/* TRUE_MIN */ - -C(( signbit (-std::numeric_limits::denorm_min()))); -C((!issignaling(-std::numeric_limits::denorm_min()))); -C((!isnan (-std::numeric_limits::denorm_min()))); -C((!isinf (-std::numeric_limits::denorm_min()))); -C(( isfinite (-std::numeric_limits::denorm_min()))); -C((!isnormal (-std::numeric_limits::denorm_min()))); -C(( issubnormal(-std::numeric_limits::denorm_min()))); -C((!iszero (-std::numeric_limits::denorm_min()))); - -C(( signbit (-std::numeric_limits::denorm_min()))); -C((!issignaling(-std::numeric_limits::denorm_min()))); -C((!isnan (-std::numeric_limits::denorm_min()))); -C((!isinf (-std::numeric_limits::denorm_min()))); -C(( isfinite (-std::numeric_limits::denorm_min()))); -C((!isnormal (-std::numeric_limits::denorm_min()))); -C(( issubnormal(-std::numeric_limits::denorm_min()))); -C((!iszero (-std::numeric_limits::denorm_min()))); - -C(( signbit (-std::numeric_limits::denorm_min()))); -C((!issignaling(-std::numeric_limits::denorm_min()))); -C((!isnan (-std::numeric_limits::denorm_min()))); -C((!isinf (-std::numeric_limits::denorm_min()))); -C(( isfinite (-std::numeric_limits::denorm_min()))); -C((!isnormal (-std::numeric_limits::denorm_min()))); -C(( issubnormal(-std::numeric_limits::denorm_min()))); -C((!iszero (-std::numeric_limits::denorm_min()))); - -/* MIN */ - -C(( signbit (-std::numeric_limits::min()))); -C((!issignaling(-std::numeric_limits::min()))); -C((!isnan (-std::numeric_limits::min()))); -C((!isinf (-std::numeric_limits::min()))); -C(( isfinite (-std::numeric_limits::min()))); -C(( isnormal (-std::numeric_limits::min()))); -C((!issubnormal(-std::numeric_limits::min()))); -C((!iszero (-std::numeric_limits::min()))); - -C(( signbit (-std::numeric_limits::min()))); -C((!issignaling(-std::numeric_limits::min()))); -C((!isnan (-std::numeric_limits::min()))); -C((!isinf (-std::numeric_limits::min()))); -C(( isfinite (-std::numeric_limits::min()))); -C(( isnormal (-std::numeric_limits::min()))); -C((!issubnormal(-std::numeric_limits::min()))); -C((!iszero (-std::numeric_limits::min()))); - -C(( signbit (-std::numeric_limits::min()))); -C((!issignaling(-std::numeric_limits::min()))); -C((!isnan (-std::numeric_limits::min()))); -C((!isinf (-std::numeric_limits::min()))); -C(( isfinite (-std::numeric_limits::min()))); -C(( isnormal (-std::numeric_limits::min()))); -C((!issubnormal(-std::numeric_limits::min()))); -C((!iszero (-std::numeric_limits::min()))); - -/* RECIP PI */ - -C(( signbit (-0.31830988618379067153776752674503f))); -C((!issignaling(-0.31830988618379067153776752674503f))); -C((!isnan (-0.31830988618379067153776752674503f))); -C((!isinf (-0.31830988618379067153776752674503f))); -C(( isfinite (-0.31830988618379067153776752674503f))); -C(( isnormal (-0.31830988618379067153776752674503f))); -C((!issubnormal(-0.31830988618379067153776752674503f))); -C((!iszero (-0.31830988618379067153776752674503f))); - -C(( signbit (-0.31830988618379067153776752674503))); -C((!issignaling(-0.31830988618379067153776752674503))); -C((!isnan (-0.31830988618379067153776752674503))); -C((!isinf (-0.31830988618379067153776752674503))); -C(( isfinite (-0.31830988618379067153776752674503))); -C(( isnormal (-0.31830988618379067153776752674503))); -C((!issubnormal(-0.31830988618379067153776752674503))); -C((!iszero (-0.31830988618379067153776752674503))); - -C(( signbit (-0.31830988618379067153776752674503L))); -C((!issignaling(-0.31830988618379067153776752674503L))); -C((!isnan (-0.31830988618379067153776752674503L))); -C((!isinf (-0.31830988618379067153776752674503L))); -C(( isfinite (-0.31830988618379067153776752674503L))); -C(( isnormal (-0.31830988618379067153776752674503L))); -C((!issubnormal(-0.31830988618379067153776752674503L))); -C((!iszero (-0.31830988618379067153776752674503L))); - -/* ONE */ - -C(( signbit (-1.0f))); -C((!issignaling(-1.0f))); -C((!isnan (-1.0f))); -C((!isinf (-1.0f))); -C(( isfinite (-1.0f))); -C(( isnormal (-1.0f))); -C((!issubnormal(-1.0f))); -C((!iszero (-1.0f))); - -C(( signbit (-1.0))); -C((!issignaling(-1.0))); -C((!isnan (-1.0))); -C((!isinf (-1.0))); -C(( isfinite (-1.0))); -C(( isnormal (-1.0))); -C((!issubnormal(-1.0))); -C((!iszero (-1.0))); - -C(( signbit (-1.0L))); -C((!issignaling(-1.0L))); -C((!isnan (-1.0L))); -C((!isinf (-1.0L))); -C(( isfinite (-1.0L))); -C(( isnormal (-1.0L))); -C((!issubnormal(-1.0L))); -C((!iszero (-1.0L))); - -/* PI */ - -C(( signbit (-3.1415926535897932384626433832795f))); -C((!issignaling(-3.1415926535897932384626433832795f))); -C((!isnan (-3.1415926535897932384626433832795f))); -C((!isinf (-3.1415926535897932384626433832795f))); -C(( isfinite (-3.1415926535897932384626433832795f))); -C(( isnormal (-3.1415926535897932384626433832795f))); -C((!issubnormal(-3.1415926535897932384626433832795f))); -C((!iszero (-3.1415926535897932384626433832795f))); - -C(( signbit (-3.1415926535897932384626433832795))); -C((!issignaling(-3.1415926535897932384626433832795))); -C((!isnan (-3.1415926535897932384626433832795))); -C((!isinf (-3.1415926535897932384626433832795))); -C(( isfinite (-3.1415926535897932384626433832795))); -C(( isnormal (-3.1415926535897932384626433832795))); -C((!issubnormal(-3.1415926535897932384626433832795))); -C((!iszero (-3.1415926535897932384626433832795))); - -C(( signbit (-3.1415926535897932384626433832795L))); -C((!issignaling(-3.1415926535897932384626433832795L))); -C((!isnan (-3.1415926535897932384626433832795L))); -C((!isinf (-3.1415926535897932384626433832795L))); -C(( isfinite (-3.1415926535897932384626433832795L))); -C(( isnormal (-3.1415926535897932384626433832795L))); -C((!issubnormal(-3.1415926535897932384626433832795L))); -C((!iszero (-3.1415926535897932384626433832795L))); - -/* MAX */ - -C(( signbit (-std::numeric_limits::max()))); -C((!issignaling(-std::numeric_limits::max()))); -C((!isnan (-std::numeric_limits::max()))); -C((!isinf (-std::numeric_limits::max()))); -C(( isfinite (-std::numeric_limits::max()))); -C(( isnormal (-std::numeric_limits::max()))); -C((!issubnormal(-std::numeric_limits::max()))); -C((!iszero (-std::numeric_limits::max()))); - -C(( signbit (-std::numeric_limits::max()))); -C((!issignaling(-std::numeric_limits::max()))); -C((!isnan (-std::numeric_limits::max()))); -C((!isinf (-std::numeric_limits::max()))); -C(( isfinite (-std::numeric_limits::max()))); -C(( isnormal (-std::numeric_limits::max()))); -C((!issubnormal(-std::numeric_limits::max()))); -C((!iszero (-std::numeric_limits::max()))); - -C(( signbit (-std::numeric_limits::max()))); -C((!issignaling(-std::numeric_limits::max()))); -C((!isnan (-std::numeric_limits::max()))); -C((!isinf (-std::numeric_limits::max()))); -C(( isfinite (-std::numeric_limits::max()))); -C(( isnormal (-std::numeric_limits::max()))); -C((!issubnormal(-std::numeric_limits::max()))); -C((!iszero (-std::numeric_limits::max()))); - -/* INFINITY */ - -C(( signbit (-__builtin_inff()))); -C((!issignaling(-__builtin_inff()))); -C((!isnan (-__builtin_inff()))); -C(( isinf (-__builtin_inff()))); -C((!isfinite (-__builtin_inff()))); -C((!isnormal (-__builtin_inff()))); -C((!issubnormal(-__builtin_inff()))); -C((!iszero (-__builtin_inff()))); - -C(( signbit (-__builtin_inf()))); -C((!issignaling(-__builtin_inf()))); -C((!isnan (-__builtin_inf()))); -C(( isinf (-__builtin_inf()))); -C((!isfinite (-__builtin_inf()))); -C((!isnormal (-__builtin_inf()))); -C((!issubnormal(-__builtin_inf()))); -C((!iszero (-__builtin_inf()))); - -C(( signbit (-__builtin_infl()))); -C((!issignaling(-__builtin_infl()))); -C((!isnan (-__builtin_infl()))); -C(( isinf (-__builtin_infl()))); -C((!isfinite (-__builtin_infl()))); -C((!isnormal (-__builtin_infl()))); -C((!issubnormal(-__builtin_infl()))); -C((!iszero (-__builtin_infl()))); - -/* NAN */ - -C(( signbit (-__builtin_nanf("")))); -C(( issignaling(-__builtin_nanf("")))); -C(( isnan (-__builtin_nanf("")))); -C((!isinf (-__builtin_nanf("")))); -C((!isfinite (-__builtin_nanf("")))); -C((!isnormal (-__builtin_nanf("")))); -C((!issubnormal(-__builtin_nanf("")))); -C((!iszero (-__builtin_nanf("")))); - -C(( signbit (-__builtin_nan("")))); -C(( issignaling(-__builtin_nan("")))); -C(( isnan (-__builtin_nan("")))); -C((!isinf (-__builtin_nan("")))); -C((!isfinite (-__builtin_nan("")))); -C((!isnormal (-__builtin_nan("")))); -C((!issubnormal(-__builtin_nan("")))); -C((!iszero (-__builtin_nan("")))); - -C(( signbit (-__builtin_nanl("")))); -C(( issignaling(-__builtin_nanl("")))); -C(( isnan (-__builtin_nanl("")))); -C((!isinf (-__builtin_nanl("")))); -C((!isfinite (-__builtin_nanl("")))); -C((!isnormal (-__builtin_nanl("")))); -C((!issubnormal(-__builtin_nanl("")))); -C((!iszero (-__builtin_nanl("")))); - -/* SIGNALING NAN */ - -C(( signbit (-__builtin_nansf("")))); -C(( issignaling(-__builtin_nansf("")))); -C(( isnan (-__builtin_nansf("")))); -C((!isinf (-__builtin_nansf("")))); -C((!isfinite (-__builtin_nansf("")))); -C((!isnormal (-__builtin_nansf("")))); -C((!issubnormal(-__builtin_nansf("")))); -C((!iszero (-__builtin_nansf("")))); - -C(( signbit (-__builtin_nans("")))); -C(( issignaling(-__builtin_nans("")))); -C(( isnan (-__builtin_nans("")))); -C((!isinf (-__builtin_nans("")))); -C((!isfinite (-__builtin_nans("")))); -C((!isnormal (-__builtin_nans("")))); -C((!issubnormal(-__builtin_nans("")))); -C((!iszero (-__builtin_nans("")))); - -C(( signbit (-__builtin_nansl("")))); -C(( issignaling(-__builtin_nansl("")))); -C(( isnan (-__builtin_nansl("")))); -C((!isinf (-__builtin_nansl("")))); -C((!isfinite (-__builtin_nansl("")))); -C((!isnormal (-__builtin_nansl("")))); -C((!issubnormal(-__builtin_nansl("")))); -C((!iszero (-__builtin_nansl("")))); - -//------------------------------------------------------------------------------ -// Integer value tests -//------------------------------------------------------------------------------ - -/* int */ - -C((!signbit (0))); -C((!issignaling(0))); -C((!isnan (0))); -C((!isinf (0))); -C(( isfinite (0))); -C((!isnormal (0))); -C((!issubnormal(0))); -C(( iszero (0))); - -C((!signbit (1))); -C((!issignaling(1))); -C((!isnan (1))); -C((!isinf (1))); -C(( isfinite (1))); -C(( isnormal (1))); -C((!issubnormal(1))); -C((!iszero (1))); - -C((!signbit (10))); -C((!issignaling(10))); -C((!isnan (10))); -C((!isinf (10))); -C(( isfinite (10))); -C(( isnormal (10))); -C((!issubnormal(10))); -C((!iszero (10))); - -C(( signbit (-1))); -C((!issignaling(-1))); -C((!isnan (-1))); -C((!isinf (-1))); -C(( isfinite (-1))); -C(( isnormal (-1))); -C((!issubnormal(-1))); -C((!iszero (-1))); - -C(( signbit (-10))); -C((!issignaling(-10))); -C((!isnan (-10))); -C((!isinf (-10))); -C(( isfinite (-10))); -C(( isnormal (-10))); -C((!issubnormal(-10))); -C((!iszero (-10))); - -/* unsigned long long */ - -C((!signbit (0ull))); -C((!issignaling(0ull))); -C((!isnan (0ull))); -C((!isinf (0ull))); -C(( isfinite (0ull))); -C((!isnormal (0ull))); -C((!issubnormal(0ull))); -C(( iszero (0ull))); - -C((!signbit (1ull))); -C((!issignaling(1ull))); -C((!isnan (1ull))); -C((!isinf (1ull))); -C(( isfinite (1ull))); -C(( isnormal (1ull))); -C((!issubnormal(1ull))); -C((!iszero (1ull))); - -C((!signbit (10ull))); -C((!issignaling(10ull))); -C((!isnan (10ull))); -C((!isinf (10ull))); -C(( isfinite (10ull))); -C(( isnormal (10ull))); -C((!issubnormal(10ull))); -C((!iszero (10ull))); - -#undef C +#include +#include +#include +#include +#include +#include +#include + +#define C(expr) static_assert(expr, #expr) + +// can't get issignaling to work at compile time at the moment +#define issignaling(...) true || true + +//------------------------------------------------------------------------------ +// Positive value tests +//------------------------------------------------------------------------------ + +/* ZERO */ + +C((!signbit (0.0f))); +C((!issignaling(0.0f))); +C((!isnan (0.0f))); +C((!isinf (0.0f))); +C(( isfinite (0.0f))); +C((!isnormal (0.0f))); +C((!issubnormal(0.0f))); +C(( iszero (0.0f))); + +C((!signbit (0.0))); +C((!issignaling(0.0))); +C((!isnan (0.0))); +C((!isinf (0.0))); +C(( isfinite (0.0))); +C((!isnormal (0.0))); +C((!issubnormal(0.0))); +C(( iszero (0.0))); + +C((!signbit (0.0L))); +C((!issignaling(0.0L))); +C((!isnan (0.0L))); +C((!isinf (0.0L))); +C(( isfinite (0.0L))); +C((!isnormal (0.0L))); +C((!issubnormal(0.0L))); +C(( iszero (0.0L))); + +/* TRUE_MIN */ + +C((!signbit (std::numeric_limits::denorm_min()))); +C((!issignaling(std::numeric_limits::denorm_min()))); +C((!isnan (std::numeric_limits::denorm_min()))); +C((!isinf (std::numeric_limits::denorm_min()))); +C(( isfinite (std::numeric_limits::denorm_min()))); +C((!isnormal (std::numeric_limits::denorm_min()))); +C(( issubnormal(std::numeric_limits::denorm_min()))); +C((!iszero (std::numeric_limits::denorm_min()))); + +C((!signbit (std::numeric_limits::denorm_min()))); +C((!issignaling(std::numeric_limits::denorm_min()))); +C((!isnan (std::numeric_limits::denorm_min()))); +C((!isinf (std::numeric_limits::denorm_min()))); +C(( isfinite (std::numeric_limits::denorm_min()))); +C((!isnormal (std::numeric_limits::denorm_min()))); +C(( issubnormal(std::numeric_limits::denorm_min()))); +C((!iszero (std::numeric_limits::denorm_min()))); + +C((!signbit (std::numeric_limits::denorm_min()))); +C((!issignaling(std::numeric_limits::denorm_min()))); +C((!isnan (std::numeric_limits::denorm_min()))); +C((!isinf (std::numeric_limits::denorm_min()))); +C(( isfinite (std::numeric_limits::denorm_min()))); +C((!isnormal (std::numeric_limits::denorm_min()))); +C(( issubnormal(std::numeric_limits::denorm_min()))); +C((!iszero (std::numeric_limits::denorm_min()))); + +/* MIN */ + +C((!signbit (std::numeric_limits::min()))); +C((!issignaling(std::numeric_limits::min()))); +C((!isnan (std::numeric_limits::min()))); +C((!isinf (std::numeric_limits::min()))); +C(( isfinite (std::numeric_limits::min()))); +C(( isnormal (std::numeric_limits::min()))); +C((!issubnormal(std::numeric_limits::min()))); +C((!iszero (std::numeric_limits::min()))); + +C((!signbit (std::numeric_limits::min()))); +C((!issignaling(std::numeric_limits::min()))); +C((!isnan (std::numeric_limits::min()))); +C((!isinf (std::numeric_limits::min()))); +C(( isfinite (std::numeric_limits::min()))); +C(( isnormal (std::numeric_limits::min()))); +C((!issubnormal(std::numeric_limits::min()))); +C((!iszero (std::numeric_limits::min()))); + +C((!signbit (std::numeric_limits::min()))); +C((!issignaling(std::numeric_limits::min()))); +C((!isnan (std::numeric_limits::min()))); +C((!isinf (std::numeric_limits::min()))); +C(( isfinite (std::numeric_limits::min()))); +C(( isnormal (std::numeric_limits::min()))); +C((!issubnormal(std::numeric_limits::min()))); +C((!iszero (std::numeric_limits::min()))); + +/* RECIP PI */ + +C((!signbit (0.31830988618379067153776752674503f))); +C((!issignaling(0.31830988618379067153776752674503f))); +C((!isnan (0.31830988618379067153776752674503f))); +C((!isinf (0.31830988618379067153776752674503f))); +C(( isfinite (0.31830988618379067153776752674503f))); +C(( isnormal (0.31830988618379067153776752674503f))); +C((!issubnormal(0.31830988618379067153776752674503f))); +C((!iszero (0.31830988618379067153776752674503f))); + +C((!signbit (0.31830988618379067153776752674503))); +C((!issignaling(0.31830988618379067153776752674503))); +C((!isnan (0.31830988618379067153776752674503))); +C((!isinf (0.31830988618379067153776752674503))); +C(( isfinite (0.31830988618379067153776752674503))); +C(( isnormal (0.31830988618379067153776752674503))); +C((!issubnormal(0.31830988618379067153776752674503))); +C((!iszero (0.31830988618379067153776752674503))); + +C((!signbit (0.31830988618379067153776752674503L))); +C((!issignaling(0.31830988618379067153776752674503L))); +C((!isnan (0.31830988618379067153776752674503L))); +C((!isinf (0.31830988618379067153776752674503L))); +C(( isfinite (0.31830988618379067153776752674503L))); +C(( isnormal (0.31830988618379067153776752674503L))); +C((!issubnormal(0.31830988618379067153776752674503L))); +C((!iszero (0.31830988618379067153776752674503L))); + +/* ONE */ + +C((!signbit (1.0f))); +C((!issignaling(1.0f))); +C((!isnan (1.0f))); +C((!isinf (1.0f))); +C(( isfinite (1.0f))); +C(( isnormal (1.0f))); +C((!issubnormal(1.0f))); +C((!iszero (1.0f))); + +C((!signbit (1.0))); +C((!issignaling(1.0))); +C((!isnan (1.0))); +C((!isinf (1.0))); +C(( isfinite (1.0))); +C(( isnormal (1.0))); +C((!issubnormal(1.0))); +C((!iszero (1.0))); + +C((!signbit (1.0L))); +C((!issignaling(1.0L))); +C((!isnan (1.0L))); +C((!isinf (1.0L))); +C(( isfinite (1.0L))); +C(( isnormal (1.0L))); +C((!issubnormal(1.0L))); +C((!iszero (1.0L))); + +/* PI */ + +C((!signbit (3.1415926535897932384626433832795f))); +C((!issignaling(3.1415926535897932384626433832795f))); +C((!isnan (3.1415926535897932384626433832795f))); +C((!isinf (3.1415926535897932384626433832795f))); +C(( isfinite (3.1415926535897932384626433832795f))); +C(( isnormal (3.1415926535897932384626433832795f))); +C((!issubnormal(3.1415926535897932384626433832795f))); +C((!iszero (3.1415926535897932384626433832795f))); + +C((!signbit (3.1415926535897932384626433832795))); +C((!issignaling(3.1415926535897932384626433832795))); +C((!isnan (3.1415926535897932384626433832795))); +C((!isinf (3.1415926535897932384626433832795))); +C(( isfinite (3.1415926535897932384626433832795))); +C(( isnormal (3.1415926535897932384626433832795))); +C((!issubnormal(3.1415926535897932384626433832795))); +C((!iszero (3.1415926535897932384626433832795))); + +C((!signbit (3.1415926535897932384626433832795L))); +C((!issignaling(3.1415926535897932384626433832795L))); +C((!isnan (3.1415926535897932384626433832795L))); +C((!isinf (3.1415926535897932384626433832795L))); +C(( isfinite (3.1415926535897932384626433832795L))); +C(( isnormal (3.1415926535897932384626433832795L))); +C((!issubnormal(3.1415926535897932384626433832795L))); +C((!iszero (3.1415926535897932384626433832795L))); + +/* MAX */ + +C((!signbit (std::numeric_limits::max()))); +C((!issignaling(std::numeric_limits::max()))); +C((!isnan (std::numeric_limits::max()))); +C((!isinf (std::numeric_limits::max()))); +C(( isfinite (std::numeric_limits::max()))); +C(( isnormal (std::numeric_limits::max()))); +C((!issubnormal(std::numeric_limits::max()))); +C((!iszero (std::numeric_limits::max()))); + +C((!signbit (std::numeric_limits::max()))); +C((!issignaling(std::numeric_limits::max()))); +C((!isnan (std::numeric_limits::max()))); +C((!isinf (std::numeric_limits::max()))); +C(( isfinite (std::numeric_limits::max()))); +C(( isnormal (std::numeric_limits::max()))); +C((!issubnormal(std::numeric_limits::max()))); +C((!iszero (std::numeric_limits::max()))); + +C((!signbit (std::numeric_limits::max()))); +C((!issignaling(std::numeric_limits::max()))); +C((!isnan (std::numeric_limits::max()))); +C((!isinf (std::numeric_limits::max()))); +C(( isfinite (std::numeric_limits::max()))); +C(( isnormal (std::numeric_limits::max()))); +C((!issubnormal(std::numeric_limits::max()))); +C((!iszero (std::numeric_limits::max()))); + +/* INFINITY */ + +C((!signbit (__builtin_inff()))); +C((!issignaling(__builtin_inff()))); +C((!isnan (__builtin_inff()))); +C(( isinf (__builtin_inff()))); +C((!isfinite (__builtin_inff()))); +C((!isnormal (__builtin_inff()))); +C((!issubnormal(__builtin_inff()))); +C((!iszero (__builtin_inff()))); + +C((!signbit (__builtin_inf()))); +C((!issignaling(__builtin_inf()))); +C((!isnan (__builtin_inf()))); +C(( isinf (__builtin_inf()))); +C((!isfinite (__builtin_inf()))); +C((!isnormal (__builtin_inf()))); +C((!issubnormal(__builtin_inf()))); +C((!iszero (__builtin_inf()))); + +C((!signbit (__builtin_infl()))); +C((!issignaling(__builtin_infl()))); +C((!isnan (__builtin_infl()))); +C(( isinf (__builtin_infl()))); +C((!isfinite (__builtin_infl()))); +C((!isnormal (__builtin_infl()))); +C((!issubnormal(__builtin_infl()))); +C((!iszero (__builtin_infl()))); + +/* NAN */ + +C((!signbit (__builtin_nanf("")))); +C(( issignaling(__builtin_nanf("")))); +C(( isnan (__builtin_nanf("")))); +C((!isinf (__builtin_nanf("")))); +C((!isfinite (__builtin_nanf("")))); +C((!isnormal (__builtin_nanf("")))); +C((!issubnormal(__builtin_nanf("")))); +C((!iszero (__builtin_nanf("")))); + +C((!signbit (__builtin_nan("")))); +C(( issignaling(__builtin_nan("")))); +C(( isnan (__builtin_nan("")))); +C((!isinf (__builtin_nan("")))); +C((!isfinite (__builtin_nan("")))); +C((!isnormal (__builtin_nan("")))); +C((!issubnormal(__builtin_nan("")))); +C((!iszero (__builtin_nan("")))); + +C((!signbit (__builtin_nanl("")))); +C(( issignaling(__builtin_nanl("")))); +C(( isnan (__builtin_nanl("")))); +C((!isinf (__builtin_nanl("")))); +C((!isfinite (__builtin_nanl("")))); +C((!isnormal (__builtin_nanl("")))); +C((!issubnormal(__builtin_nanl("")))); +C((!iszero (__builtin_nanl("")))); + +/* SIGNALING NAN */ + +C((!signbit (__builtin_nansf("")))); +C(( issignaling(__builtin_nansf("")))); +C(( isnan (__builtin_nansf("")))); +C((!isinf (__builtin_nansf("")))); +C((!isfinite (__builtin_nansf("")))); +C((!isnormal (__builtin_nansf("")))); +C((!issubnormal(__builtin_nansf("")))); +C((!iszero (__builtin_nansf("")))); + +C((!signbit (__builtin_nans("")))); +C(( issignaling(__builtin_nans("")))); +C(( isnan (__builtin_nans("")))); +C((!isinf (__builtin_nans("")))); +C((!isfinite (__builtin_nans("")))); +C((!isnormal (__builtin_nans("")))); +C((!issubnormal(__builtin_nans("")))); +C((!iszero (__builtin_nans("")))); + +C((!signbit (__builtin_nansl("")))); +C(( issignaling(__builtin_nansl("")))); +C(( isnan (__builtin_nansl("")))); +C((!isinf (__builtin_nansl("")))); +C((!isfinite (__builtin_nansl("")))); +C((!isnormal (__builtin_nansl("")))); +C((!issubnormal(__builtin_nansl("")))); +C((!iszero (__builtin_nansl("")))); + +//------------------------------------------------------------------------------ +// Negative value tests +//------------------------------------------------------------------------------ + +/* ZERO */ + +C(( signbit (-0.0f))); +C((!issignaling(-0.0f))); +C((!isnan (-0.0f))); +C((!isinf (-0.0f))); +C(( isfinite (-0.0f))); +C((!isnormal (-0.0f))); +C((!issubnormal(-0.0f))); +C(( iszero (-0.0f))); + +C(( signbit (-0.0))); +C((!issignaling(-0.0))); +C((!isnan (-0.0))); +C((!isinf (-0.0))); +C(( isfinite (-0.0))); +C((!isnormal (-0.0))); +C((!issubnormal(-0.0))); +C(( iszero (-0.0))); + +C(( signbit (-0.0L))); +C((!issignaling(-0.0L))); +C((!isnan (-0.0L))); +C((!isinf (-0.0L))); +C(( isfinite (-0.0L))); +C((!isnormal (-0.0L))); +C((!issubnormal(-0.0L))); +C(( iszero (-0.0L))); + +/* TRUE_MIN */ + +C(( signbit (-std::numeric_limits::denorm_min()))); +C((!issignaling(-std::numeric_limits::denorm_min()))); +C((!isnan (-std::numeric_limits::denorm_min()))); +C((!isinf (-std::numeric_limits::denorm_min()))); +C(( isfinite (-std::numeric_limits::denorm_min()))); +C((!isnormal (-std::numeric_limits::denorm_min()))); +C(( issubnormal(-std::numeric_limits::denorm_min()))); +C((!iszero (-std::numeric_limits::denorm_min()))); + +C(( signbit (-std::numeric_limits::denorm_min()))); +C((!issignaling(-std::numeric_limits::denorm_min()))); +C((!isnan (-std::numeric_limits::denorm_min()))); +C((!isinf (-std::numeric_limits::denorm_min()))); +C(( isfinite (-std::numeric_limits::denorm_min()))); +C((!isnormal (-std::numeric_limits::denorm_min()))); +C(( issubnormal(-std::numeric_limits::denorm_min()))); +C((!iszero (-std::numeric_limits::denorm_min()))); + +C(( signbit (-std::numeric_limits::denorm_min()))); +C((!issignaling(-std::numeric_limits::denorm_min()))); +C((!isnan (-std::numeric_limits::denorm_min()))); +C((!isinf (-std::numeric_limits::denorm_min()))); +C(( isfinite (-std::numeric_limits::denorm_min()))); +C((!isnormal (-std::numeric_limits::denorm_min()))); +C(( issubnormal(-std::numeric_limits::denorm_min()))); +C((!iszero (-std::numeric_limits::denorm_min()))); + +/* MIN */ + +C(( signbit (-std::numeric_limits::min()))); +C((!issignaling(-std::numeric_limits::min()))); +C((!isnan (-std::numeric_limits::min()))); +C((!isinf (-std::numeric_limits::min()))); +C(( isfinite (-std::numeric_limits::min()))); +C(( isnormal (-std::numeric_limits::min()))); +C((!issubnormal(-std::numeric_limits::min()))); +C((!iszero (-std::numeric_limits::min()))); + +C(( signbit (-std::numeric_limits::min()))); +C((!issignaling(-std::numeric_limits::min()))); +C((!isnan (-std::numeric_limits::min()))); +C((!isinf (-std::numeric_limits::min()))); +C(( isfinite (-std::numeric_limits::min()))); +C(( isnormal (-std::numeric_limits::min()))); +C((!issubnormal(-std::numeric_limits::min()))); +C((!iszero (-std::numeric_limits::min()))); + +C(( signbit (-std::numeric_limits::min()))); +C((!issignaling(-std::numeric_limits::min()))); +C((!isnan (-std::numeric_limits::min()))); +C((!isinf (-std::numeric_limits::min()))); +C(( isfinite (-std::numeric_limits::min()))); +C(( isnormal (-std::numeric_limits::min()))); +C((!issubnormal(-std::numeric_limits::min()))); +C((!iszero (-std::numeric_limits::min()))); + +/* RECIP PI */ + +C(( signbit (-0.31830988618379067153776752674503f))); +C((!issignaling(-0.31830988618379067153776752674503f))); +C((!isnan (-0.31830988618379067153776752674503f))); +C((!isinf (-0.31830988618379067153776752674503f))); +C(( isfinite (-0.31830988618379067153776752674503f))); +C(( isnormal (-0.31830988618379067153776752674503f))); +C((!issubnormal(-0.31830988618379067153776752674503f))); +C((!iszero (-0.31830988618379067153776752674503f))); + +C(( signbit (-0.31830988618379067153776752674503))); +C((!issignaling(-0.31830988618379067153776752674503))); +C((!isnan (-0.31830988618379067153776752674503))); +C((!isinf (-0.31830988618379067153776752674503))); +C(( isfinite (-0.31830988618379067153776752674503))); +C(( isnormal (-0.31830988618379067153776752674503))); +C((!issubnormal(-0.31830988618379067153776752674503))); +C((!iszero (-0.31830988618379067153776752674503))); + +C(( signbit (-0.31830988618379067153776752674503L))); +C((!issignaling(-0.31830988618379067153776752674503L))); +C((!isnan (-0.31830988618379067153776752674503L))); +C((!isinf (-0.31830988618379067153776752674503L))); +C(( isfinite (-0.31830988618379067153776752674503L))); +C(( isnormal (-0.31830988618379067153776752674503L))); +C((!issubnormal(-0.31830988618379067153776752674503L))); +C((!iszero (-0.31830988618379067153776752674503L))); + +/* ONE */ + +C(( signbit (-1.0f))); +C((!issignaling(-1.0f))); +C((!isnan (-1.0f))); +C((!isinf (-1.0f))); +C(( isfinite (-1.0f))); +C(( isnormal (-1.0f))); +C((!issubnormal(-1.0f))); +C((!iszero (-1.0f))); + +C(( signbit (-1.0))); +C((!issignaling(-1.0))); +C((!isnan (-1.0))); +C((!isinf (-1.0))); +C(( isfinite (-1.0))); +C(( isnormal (-1.0))); +C((!issubnormal(-1.0))); +C((!iszero (-1.0))); + +C(( signbit (-1.0L))); +C((!issignaling(-1.0L))); +C((!isnan (-1.0L))); +C((!isinf (-1.0L))); +C(( isfinite (-1.0L))); +C(( isnormal (-1.0L))); +C((!issubnormal(-1.0L))); +C((!iszero (-1.0L))); + +/* PI */ + +C(( signbit (-3.1415926535897932384626433832795f))); +C((!issignaling(-3.1415926535897932384626433832795f))); +C((!isnan (-3.1415926535897932384626433832795f))); +C((!isinf (-3.1415926535897932384626433832795f))); +C(( isfinite (-3.1415926535897932384626433832795f))); +C(( isnormal (-3.1415926535897932384626433832795f))); +C((!issubnormal(-3.1415926535897932384626433832795f))); +C((!iszero (-3.1415926535897932384626433832795f))); + +C(( signbit (-3.1415926535897932384626433832795))); +C((!issignaling(-3.1415926535897932384626433832795))); +C((!isnan (-3.1415926535897932384626433832795))); +C((!isinf (-3.1415926535897932384626433832795))); +C(( isfinite (-3.1415926535897932384626433832795))); +C(( isnormal (-3.1415926535897932384626433832795))); +C((!issubnormal(-3.1415926535897932384626433832795))); +C((!iszero (-3.1415926535897932384626433832795))); + +C(( signbit (-3.1415926535897932384626433832795L))); +C((!issignaling(-3.1415926535897932384626433832795L))); +C((!isnan (-3.1415926535897932384626433832795L))); +C((!isinf (-3.1415926535897932384626433832795L))); +C(( isfinite (-3.1415926535897932384626433832795L))); +C(( isnormal (-3.1415926535897932384626433832795L))); +C((!issubnormal(-3.1415926535897932384626433832795L))); +C((!iszero (-3.1415926535897932384626433832795L))); + +/* MAX */ + +C(( signbit (-std::numeric_limits::max()))); +C((!issignaling(-std::numeric_limits::max()))); +C((!isnan (-std::numeric_limits::max()))); +C((!isinf (-std::numeric_limits::max()))); +C(( isfinite (-std::numeric_limits::max()))); +C(( isnormal (-std::numeric_limits::max()))); +C((!issubnormal(-std::numeric_limits::max()))); +C((!iszero (-std::numeric_limits::max()))); + +C(( signbit (-std::numeric_limits::max()))); +C((!issignaling(-std::numeric_limits::max()))); +C((!isnan (-std::numeric_limits::max()))); +C((!isinf (-std::numeric_limits::max()))); +C(( isfinite (-std::numeric_limits::max()))); +C(( isnormal (-std::numeric_limits::max()))); +C((!issubnormal(-std::numeric_limits::max()))); +C((!iszero (-std::numeric_limits::max()))); + +C(( signbit (-std::numeric_limits::max()))); +C((!issignaling(-std::numeric_limits::max()))); +C((!isnan (-std::numeric_limits::max()))); +C((!isinf (-std::numeric_limits::max()))); +C(( isfinite (-std::numeric_limits::max()))); +C(( isnormal (-std::numeric_limits::max()))); +C((!issubnormal(-std::numeric_limits::max()))); +C((!iszero (-std::numeric_limits::max()))); + +/* INFINITY */ + +C(( signbit (-__builtin_inff()))); +C((!issignaling(-__builtin_inff()))); +C((!isnan (-__builtin_inff()))); +C(( isinf (-__builtin_inff()))); +C((!isfinite (-__builtin_inff()))); +C((!isnormal (-__builtin_inff()))); +C((!issubnormal(-__builtin_inff()))); +C((!iszero (-__builtin_inff()))); + +C(( signbit (-__builtin_inf()))); +C((!issignaling(-__builtin_inf()))); +C((!isnan (-__builtin_inf()))); +C(( isinf (-__builtin_inf()))); +C((!isfinite (-__builtin_inf()))); +C((!isnormal (-__builtin_inf()))); +C((!issubnormal(-__builtin_inf()))); +C((!iszero (-__builtin_inf()))); + +C(( signbit (-__builtin_infl()))); +C((!issignaling(-__builtin_infl()))); +C((!isnan (-__builtin_infl()))); +C(( isinf (-__builtin_infl()))); +C((!isfinite (-__builtin_infl()))); +C((!isnormal (-__builtin_infl()))); +C((!issubnormal(-__builtin_infl()))); +C((!iszero (-__builtin_infl()))); + +/* NAN */ + +C(( signbit (-__builtin_nanf("")))); +C(( issignaling(-__builtin_nanf("")))); +C(( isnan (-__builtin_nanf("")))); +C((!isinf (-__builtin_nanf("")))); +C((!isfinite (-__builtin_nanf("")))); +C((!isnormal (-__builtin_nanf("")))); +C((!issubnormal(-__builtin_nanf("")))); +C((!iszero (-__builtin_nanf("")))); + +C(( signbit (-__builtin_nan("")))); +C(( issignaling(-__builtin_nan("")))); +C(( isnan (-__builtin_nan("")))); +C((!isinf (-__builtin_nan("")))); +C((!isfinite (-__builtin_nan("")))); +C((!isnormal (-__builtin_nan("")))); +C((!issubnormal(-__builtin_nan("")))); +C((!iszero (-__builtin_nan("")))); + +C(( signbit (-__builtin_nanl("")))); +C(( issignaling(-__builtin_nanl("")))); +C(( isnan (-__builtin_nanl("")))); +C((!isinf (-__builtin_nanl("")))); +C((!isfinite (-__builtin_nanl("")))); +C((!isnormal (-__builtin_nanl("")))); +C((!issubnormal(-__builtin_nanl("")))); +C((!iszero (-__builtin_nanl("")))); + +/* SIGNALING NAN */ + +C(( signbit (-__builtin_nansf("")))); +C(( issignaling(-__builtin_nansf("")))); +C(( isnan (-__builtin_nansf("")))); +C((!isinf (-__builtin_nansf("")))); +C((!isfinite (-__builtin_nansf("")))); +C((!isnormal (-__builtin_nansf("")))); +C((!issubnormal(-__builtin_nansf("")))); +C((!iszero (-__builtin_nansf("")))); + +C(( signbit (-__builtin_nans("")))); +C(( issignaling(-__builtin_nans("")))); +C(( isnan (-__builtin_nans("")))); +C((!isinf (-__builtin_nans("")))); +C((!isfinite (-__builtin_nans("")))); +C((!isnormal (-__builtin_nans("")))); +C((!issubnormal(-__builtin_nans("")))); +C((!iszero (-__builtin_nans("")))); + +C(( signbit (-__builtin_nansl("")))); +C(( issignaling(-__builtin_nansl("")))); +C(( isnan (-__builtin_nansl("")))); +C((!isinf (-__builtin_nansl("")))); +C((!isfinite (-__builtin_nansl("")))); +C((!isnormal (-__builtin_nansl("")))); +C((!issubnormal(-__builtin_nansl("")))); +C((!iszero (-__builtin_nansl("")))); + +//------------------------------------------------------------------------------ +// Integer value tests +//------------------------------------------------------------------------------ + +/* int */ + +C((!signbit (0))); +C((!issignaling(0))); +C((!isnan (0))); +C((!isinf (0))); +C(( isfinite (0))); +C((!isnormal (0))); +C((!issubnormal(0))); +C(( iszero (0))); + +C((!signbit (1))); +C((!issignaling(1))); +C((!isnan (1))); +C((!isinf (1))); +C(( isfinite (1))); +C(( isnormal (1))); +C((!issubnormal(1))); +C((!iszero (1))); + +C((!signbit (10))); +C((!issignaling(10))); +C((!isnan (10))); +C((!isinf (10))); +C(( isfinite (10))); +C(( isnormal (10))); +C((!issubnormal(10))); +C((!iszero (10))); + +C(( signbit (-1))); +C((!issignaling(-1))); +C((!isnan (-1))); +C((!isinf (-1))); +C(( isfinite (-1))); +C(( isnormal (-1))); +C((!issubnormal(-1))); +C((!iszero (-1))); + +C(( signbit (-10))); +C((!issignaling(-10))); +C((!isnan (-10))); +C((!isinf (-10))); +C(( isfinite (-10))); +C(( isnormal (-10))); +C((!issubnormal(-10))); +C((!iszero (-10))); + +/* unsigned long long */ + +C((!signbit (0ull))); +C((!issignaling(0ull))); +C((!isnan (0ull))); +C((!isinf (0ull))); +C(( isfinite (0ull))); +C((!isnormal (0ull))); +C((!issubnormal(0ull))); +C(( iszero (0ull))); + +C((!signbit (1ull))); +C((!issignaling(1ull))); +C((!isnan (1ull))); +C((!isinf (1ull))); +C(( isfinite (1ull))); +C(( isnormal (1ull))); +C((!issubnormal(1ull))); +C((!iszero (1ull))); + +C((!signbit (10ull))); +C((!issignaling(10ull))); +C((!isnan (10ull))); +C((!isinf (10ull))); +C(( isfinite (10ull))); +C(( isnormal (10ull))); +C((!issubnormal(10ull))); +C((!iszero (10ull))); + +#undef C diff --git a/src/libcxx/type_traits.cpp b/src/libcxx/type_traits.cpp index 80e7bfdf2..07270b0e2 100644 --- a/src/libcxx/type_traits.cpp +++ b/src/libcxx/type_traits.cpp @@ -702,7 +702,7 @@ C((is_same_v>)); C((is_same_v::type>)); //------------------------------------------------------------------------------ -// alignment_of +// alignment_of //------------------------------------------------------------------------------ // test alignment_of @@ -732,6 +732,30 @@ C((extent_v == 0)); // test remove_all_extents /** @todo */ +// test is_bounded_array +namespace test_is_bounded_array { + class A {}; + C((!is_bounded_array_v)); + C((!is_bounded_array_v)); + C(( is_bounded_array_v)); + C((!is_bounded_array_v)); + C((!is_bounded_array_v)); + C((!is_bounded_array_v)); + C(( is_bounded_array_v)); +} + +// test is_unbounded_array +namespace test_is_unbounded_array { + class A {}; + C((!is_unbounded_array_v)); + C(( is_unbounded_array_v)); + C((!is_unbounded_array_v)); + C((!is_unbounded_array_v)); + C((!is_unbounded_array_v)); + C(( is_unbounded_array_v)); + C((!is_unbounded_array_v)); +} + //------------------------------------------------------------------------------ // decay //------------------------------------------------------------------------------ @@ -873,6 +897,10 @@ C((is_nothrow_assignable_v)); C((is_copy_assignable_v)); C((!is_copy_assignable_v)); +// test is_trivially_copy_assignable_v +/** @todo get more complicated tests */ +C((is_trivially_copy_assignable_v)); + // test is_nothrow_copy_assignable /** @todo get more complicated tests */ C((is_nothrow_copy_assignable_v)); @@ -888,6 +916,10 @@ namespace test_is_move_assignable { C((is_move_assignable_v)); } +// test is_trivially_move_assignable +/** @todo get more complicated tests */ +C((is_trivially_move_assignable_v)); + // test is_nothrow_move_assignable /** @todo get more complicated tests */ namespace test_is_nothrow_move_assignable { diff --git a/test/standalone/concepts/src/main.cpp b/test/standalone/concepts/src/main.cpp index 3a7b9ae40..8083ee0a5 100644 --- a/test/standalone/concepts/src/main.cpp +++ b/test/standalone/concepts/src/main.cpp @@ -28,7 +28,7 @@ namespace test_derived_from { class A {}; class B : public A {}; class C : private A {}; - + static_assert(std::derived_from == true); static_assert(std::derived_from == false); static_assert(std::derived_from == true); @@ -59,7 +59,7 @@ namespace test_floating_point { constexpr auto d = x2(1.1); constexpr auto f = x2(2.2f); constexpr auto i = x2(444); - + static_assert(std::is_same_v); static_assert(std::is_same_v); static_assert(std::is_same_v); @@ -77,11 +77,11 @@ namespace test_swap { namespace Ns { class A { int id {}; - + friend void swap(A& lhs, A& rhs) { std::swap(lhs.id, rhs.id); } - + public: A(int i) : id {i} {} A(A const&) = delete; @@ -89,7 +89,7 @@ namespace test_swap { int get_val(void) { return id; } }; } - + void swap_test(int *arr) { int a = 5, b = 3; *arr++ = a; @@ -97,7 +97,7 @@ namespace test_swap { std::swap(a, b); *arr++ = a; *arr++ = b; - + Ns::A p {6}, q {9}; *arr++ = p.get_val(); *arr++ = q.get_val();