Prefer to use the __is_XXX compiler intrinsics to the (old, busted) __has_XXX intrinsics when implementing type traits. Thanks to Richard Smith for the patch.
git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@344254 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -3686,7 +3686,12 @@ _LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR bool is_trivially_move_assignable_v
|
|||||||
|
|
||||||
// is_trivially_destructible
|
// is_trivially_destructible
|
||||||
|
|
||||||
#if __has_feature(has_trivial_destructor) || (_GNUC_VER >= 403)
|
#if __has_keyword(__is_trivially_destructible)
|
||||||
|
|
||||||
|
template <class _Tp> struct _LIBCPP_TEMPLATE_VIS is_trivially_destructible
|
||||||
|
: public integral_constant<bool, __is_trivially_destructible(_Tp)> {};
|
||||||
|
|
||||||
|
#elif __has_feature(has_trivial_destructor) || (_GNUC_VER >= 403)
|
||||||
|
|
||||||
template <class _Tp> struct _LIBCPP_TEMPLATE_VIS is_trivially_destructible
|
template <class _Tp> struct _LIBCPP_TEMPLATE_VIS is_trivially_destructible
|
||||||
: public integral_constant<bool, is_destructible<_Tp>::value && __has_trivial_destructor(_Tp)> {};
|
: public integral_constant<bool, is_destructible<_Tp>::value && __has_trivial_destructor(_Tp)> {};
|
||||||
@@ -3713,18 +3718,15 @@ _LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR bool is_trivially_destructible_v
|
|||||||
|
|
||||||
// is_nothrow_constructible
|
// is_nothrow_constructible
|
||||||
|
|
||||||
#if 0
|
|
||||||
template <class _Tp, class... _Args>
|
|
||||||
struct _LIBCPP_TEMPLATE_VIS is_nothrow_constructible
|
|
||||||
: public integral_constant<bool, __is_nothrow_constructible(_Tp(_Args...))>
|
|
||||||
{
|
|
||||||
};
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
#ifndef _LIBCPP_HAS_NO_VARIADICS
|
#ifndef _LIBCPP_HAS_NO_VARIADICS
|
||||||
|
|
||||||
#if __has_feature(cxx_noexcept) || (_GNUC_VER >= 407 && __cplusplus >= 201103L)
|
#if __has_keyword(__is_nothrow_constructible)
|
||||||
|
|
||||||
|
template <class _Tp, class... _Args>
|
||||||
|
struct _LIBCPP_TEMPLATE_VIS is_nothrow_constructible
|
||||||
|
: public integral_constant<bool, __is_nothrow_constructible(_Tp, _Args...)> {};
|
||||||
|
|
||||||
|
#elif __has_feature(cxx_noexcept) || (_GNUC_VER >= 407 && __cplusplus >= 201103L)
|
||||||
|
|
||||||
template <bool, bool, class _Tp, class... _Args> struct __libcpp_is_nothrow_constructible;
|
template <bool, bool, class _Tp, class... _Args> struct __libcpp_is_nothrow_constructible;
|
||||||
|
|
||||||
@@ -3761,7 +3763,7 @@ struct _LIBCPP_TEMPLATE_VIS is_nothrow_constructible<_Tp[_Ns]>
|
|||||||
{
|
{
|
||||||
};
|
};
|
||||||
|
|
||||||
#else // __has_feature(cxx_noexcept)
|
#else // __has_keyword(__is_nothrow_constructible) || __has_feature(cxx_noexcept)
|
||||||
|
|
||||||
template <class _Tp, class... _Args>
|
template <class _Tp, class... _Args>
|
||||||
struct _LIBCPP_TEMPLATE_VIS is_nothrow_constructible
|
struct _LIBCPP_TEMPLATE_VIS is_nothrow_constructible
|
||||||
@@ -3817,6 +3819,23 @@ struct _LIBCPP_TEMPLATE_VIS is_nothrow_constructible<_Tp, _Tp&>
|
|||||||
|
|
||||||
#else // _LIBCPP_HAS_NO_VARIADICS
|
#else // _LIBCPP_HAS_NO_VARIADICS
|
||||||
|
|
||||||
|
#if __has_keyword(__is_nothrow_constructible)
|
||||||
|
|
||||||
|
template <class _Tp, class _A0 = __is_construct::__nat,
|
||||||
|
class _A1 = __is_construct::__nat>
|
||||||
|
struct _LIBCPP_TEMPLATE_VIS is_nothrow_constructible
|
||||||
|
: public integral_constant<bool, __is_nothrow_constructible(_Tp, _A0, _A1)> {};
|
||||||
|
|
||||||
|
template <class _Tp, class _A0>
|
||||||
|
struct _LIBCPP_TEMPLATE_VIS is_nothrow_constructible<_Tp, _A0>
|
||||||
|
: public integral_constant<bool, __is_nothrow_constructible(_Tp, _A0)> {};
|
||||||
|
|
||||||
|
template <class _Tp>
|
||||||
|
struct _LIBCPP_TEMPLATE_VIS is_nothrow_constructible<_Tp>
|
||||||
|
: public integral_constant<bool, __is_nothrow_constructible(_Tp)> {};
|
||||||
|
|
||||||
|
#else // __has_keyword(__is_nothrow_constructible)
|
||||||
|
|
||||||
template <class _Tp, class _A0 = __is_construct::__nat,
|
template <class _Tp, class _A0 = __is_construct::__nat,
|
||||||
class _A1 = __is_construct::__nat>
|
class _A1 = __is_construct::__nat>
|
||||||
struct _LIBCPP_TEMPLATE_VIS is_nothrow_constructible
|
struct _LIBCPP_TEMPLATE_VIS is_nothrow_constructible
|
||||||
@@ -3868,8 +3887,8 @@ struct _LIBCPP_TEMPLATE_VIS is_nothrow_constructible<_Tp, _Tp&,
|
|||||||
{
|
{
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#endif // __has_keyword(__is_nothrow_constructible)
|
||||||
#endif // _LIBCPP_HAS_NO_VARIADICS
|
#endif // _LIBCPP_HAS_NO_VARIADICS
|
||||||
#endif // __has_feature(is_nothrow_constructible)
|
|
||||||
|
|
||||||
#if _LIBCPP_STD_VER > 14 && !defined(_LIBCPP_HAS_NO_VARIABLE_TEMPLATES) && !defined(_LIBCPP_HAS_NO_VARIADICS)
|
#if _LIBCPP_STD_VER > 14 && !defined(_LIBCPP_HAS_NO_VARIABLE_TEMPLATES) && !defined(_LIBCPP_HAS_NO_VARIADICS)
|
||||||
template <class _Tp, class ..._Args>
|
template <class _Tp, class ..._Args>
|
||||||
@@ -3919,7 +3938,13 @@ _LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR bool is_nothrow_move_constructible_v
|
|||||||
|
|
||||||
// is_nothrow_assignable
|
// is_nothrow_assignable
|
||||||
|
|
||||||
#if __has_feature(cxx_noexcept) || (_GNUC_VER >= 407 && __cplusplus >= 201103L)
|
#if __has_keyword(__is_nothrow_assignable)
|
||||||
|
|
||||||
|
template <class _Tp, class _Arg>
|
||||||
|
struct _LIBCPP_TEMPLATE_VIS is_nothrow_assignable
|
||||||
|
: public integral_constant<bool, __is_nothrow_assignable(_Tp, _Arg)> {};
|
||||||
|
|
||||||
|
#elif __has_feature(cxx_noexcept) || (_GNUC_VER >= 407 && __cplusplus >= 201103L)
|
||||||
|
|
||||||
template <bool, class _Tp, class _Arg> struct __libcpp_is_nothrow_assignable;
|
template <bool, class _Tp, class _Arg> struct __libcpp_is_nothrow_assignable;
|
||||||
|
|
||||||
@@ -3941,7 +3966,7 @@ struct _LIBCPP_TEMPLATE_VIS is_nothrow_assignable
|
|||||||
{
|
{
|
||||||
};
|
};
|
||||||
|
|
||||||
#else // __has_feature(cxx_noexcept)
|
#else // __has_keyword(__is_nothrow_assignable) || __has_feature(cxx_noexcept)
|
||||||
|
|
||||||
template <class _Tp, class _Arg>
|
template <class _Tp, class _Arg>
|
||||||
struct _LIBCPP_TEMPLATE_VIS is_nothrow_assignable
|
struct _LIBCPP_TEMPLATE_VIS is_nothrow_assignable
|
||||||
|
|||||||
Reference in New Issue
Block a user