From eeeada1c775ba6a9a6b5519cdec9bc54c7f4ddf7 Mon Sep 17 00:00:00 2001 From: Eric Fiselier Date: Sat, 13 Jun 2015 02:18:44 +0000 Subject: [PATCH] Enable __is_trivially* intrinsics for GCC 5.1 Until GCC 5.1 the __is_trivially* intrinsics were not provided. Enable use of the builtins for GCC 5.1. Also enable Reference qualified member functions for GCC 4.9 and greater. This patch also defines _GNUC_VER to 0 when __GNUC__ is not defined because libc++ assumes _GNUC_VER is always defined. git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@239653 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/__config | 2 ++ include/type_traits | 15 +++++++++------ 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/include/__config b/include/__config index 97c66c85..79f34e44 100644 --- a/include/__config +++ b/include/__config @@ -17,6 +17,8 @@ #ifdef __GNUC__ #define _GNUC_VER (__GNUC__ * 100 + __GNUC_MINOR__) +#else +#define _GNUC_VER 0 #endif #if !_WIN32 diff --git a/include/type_traits b/include/type_traits index 760047ab..20dc1568 100644 --- a/include/type_traits +++ b/include/type_traits @@ -1789,7 +1789,8 @@ struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param..., ...) const volatil typedef _Rp (_FnType) (_Param..., ...); }; -#if __has_feature(cxx_reference_qualified_functions) +#if __has_feature(cxx_reference_qualified_functions) || \ + (defined(_GNUC_VER) && _GNUC_VER >= 409) template struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param...) &, true, false> @@ -1919,7 +1920,7 @@ struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param..., ...) const volatil typedef _Rp (_FnType) (_Param..., ...); }; -#endif // __has_feature(cxx_reference_qualified_functions) +#endif // __has_feature(cxx_reference_qualified_functions) || _GNUC_VER >= 409 #else // _LIBCPP_HAS_NO_VARIADICS @@ -2691,7 +2692,7 @@ struct _LIBCPP_TYPE_VIS_ONLY is_move_constructible #ifndef _LIBCPP_HAS_NO_VARIADICS -#if __has_feature(is_trivially_constructible) +#if __has_feature(is_trivially_constructible) || _GNUC_VER >= 501 template struct _LIBCPP_TYPE_VIS_ONLY is_trivially_constructible @@ -2750,7 +2751,7 @@ struct _LIBCPP_TYPE_VIS_ONLY is_trivially_constructible { }; -#if __has_feature(is_trivially_constructible) +#if __has_feature(is_trivially_constructible) || _GNUC_VER >= 501 template struct _LIBCPP_TYPE_VIS_ONLY is_trivially_constructible<_Tp, __is_construct::__nat, @@ -2838,7 +2839,7 @@ template struct _LIBCPP_TYPE_VIS_ONLY is_trivially_move_constructibl // is_trivially_assignable -#if __has_feature(is_trivially_assignable) +#if __has_feature(is_trivially_assignable) || _GNUC_VER >= 501 template struct is_trivially_assignable @@ -3276,6 +3277,8 @@ template struct _LIBCPP_TYPE_VIS_ONLY is_standard_layout template struct _LIBCPP_TYPE_VIS_ONLY is_trivially_copyable #if __has_feature(is_trivially_copyable) : public integral_constant +#elif _GNUC_VER >= 501 + : public integral_constant::value && __is_trivially_copyable(_Tp)> #else : integral_constant::type>::value> #endif @@ -3284,7 +3287,7 @@ template struct _LIBCPP_TYPE_VIS_ONLY is_trivially_copyable // is_trivial; template struct _LIBCPP_TYPE_VIS_ONLY is_trivial -#if __has_feature(is_trivial) || (_GNUC_VER >= 407) +#if __has_feature(is_trivial) || _GNUC_VER >= 407 : public integral_constant #else : integral_constant::value &&