Index: include/__config =================================================================== --- include/__config +++ include/__config @@ -75,10 +75,8 @@ #ifdef _WIN32 # define _LIBCPP_LITTLE_ENDIAN 1 # define _LIBCPP_BIG_ENDIAN 0 -// Compiler intrinsics (GCC or MSVC) -# if defined(__clang__) \ - || (defined(_MSC_VER) && _MSC_VER >= 1400) \ - || (defined(__GNUC__) && _GNUC_VER > 403) +// Compiler intrinsics (MSVC) +#if defined(_MSC_VER) && _MSC_VER >= 1400 # define _LIBCPP_HAS_IS_BASE_OF # endif # if defined(_MSC_VER) && !defined(__clang__) @@ -93,12 +91,6 @@ # endif #endif // _WIN32 -#ifdef __linux__ -# if defined(__GNUC__) && _GNUC_VER >= 403 -# define _LIBCPP_HAS_IS_BASE_OF -# endif -#endif - #ifdef __sun__ # include # ifdef _LITTLE_ENDIAN @@ -318,6 +310,10 @@ # define _LIBCPP_HAS_IS_BASE_OF #endif +#if __has_feature(is_final) +# define _LIBCPP_HAS_IS_FINAL +#endif + // Objective-C++ features (opt-in) #if __has_feature(objc_arc) #define _LIBCPP_HAS_OBJC_ARC @@ -401,6 +397,11 @@ #if _GNUC_VER >= 407 #define _LIBCPP_UNDERLYING_TYPE(T) __underlying_type(T) #define _LIBCPP_IS_LITERAL(T) __is_literal_type(T) +#define _LIBCPP_HAS_IS_FINAL +#endif + +#if defined(__GNUC__) && _GNUC_VER >= 403 +# define _LIBCPP_HAS_IS_BASE_OF #endif #if !__EXCEPTIONS @@ -535,6 +536,7 @@ #define _LIBCPP_HAS_NO_NULLPTR #define _LIBCPP_HAS_NO_UNICODE_CHARS #define _LIBCPP_HAS_IS_BASE_OF +#define _LIBCPP_HAS_IS_FINAL #define _LIBCPP_HAS_NO_VARIABLE_TEMPLATES #if defined(_AIX) Index: include/exception =================================================================== --- include/exception +++ include/exception @@ -193,7 +193,7 @@ throw_with_nested(_Tp&& __t, typename enable_if< is_class::type>::value && !is_base_of::type>::value -#if _LIBCPP_STD_VER > 11 +#if defined(_LIBCPP_HAS_IS_FINAL) && !is_final::type>::value #endif >::type* = 0) @@ -215,7 +215,7 @@ throw_with_nested(_Tp&& __t, typename enable_if< !is_class::type>::value || is_base_of::type>::value -#if _LIBCPP_STD_VER > 11 +#if defined(_LIBCPP_HAS_IS_FINAL) || is_final::type>::value #endif >::type* = 0) Index: include/ext/hash_map =================================================================== --- include/ext/hash_map +++ include/ext/hash_map @@ -203,6 +203,7 @@ #include <__hash_table> #include #include +#include #include #if __DEPRECATED @@ -220,8 +221,8 @@ using namespace std; template ::value -#if __has_feature(is_final) - && !__is_final(_Hash) +#if defined(_LIBCPP_HAS_IS_FINAL) + && !is_final<_Hash>::value #endif > class __hash_map_hasher @@ -256,8 +257,8 @@ }; template ::value -#if __has_feature(is_final) - && !__is_final(_Pred) +#if defined(_LIBCPP_HAS_IS_FINAL) + && !is_final<_Pred>::value #endif > class __hash_map_equal Index: include/map =================================================================== --- include/map +++ include/map @@ -428,6 +428,7 @@ #include #include #include +#include #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) #pragma GCC system_header @@ -436,8 +437,8 @@ _LIBCPP_BEGIN_NAMESPACE_STD template ::value -#if __has_feature(is_final) - && !__is_final(_Compare) +#if defined(_LIBCPP_HAS_IS_FINAL) + && !is_final<_Compare>::value #endif > class __map_value_compare Index: include/memory =================================================================== --- include/memory +++ include/memory @@ -1947,13 +1947,13 @@ template ::type, typename remove_cv<_T2>::type>::value, bool = is_empty<_T1>::value -#if __has_feature(is_final) - && !__is_final(_T1) +#if defined(_LIBCPP_HAS_IS_FINAL) + && !is_final<_T1>::value #endif , bool = is_empty<_T2>::value -#if __has_feature(is_final) - && !__is_final(_T2) +#if defined(_LIBCPP_HAS_IS_FINAL) + && !is_final<_T2>::value #endif > struct __libcpp_compressed_pair_switch; Index: include/tuple =================================================================== --- include/tuple +++ include/tuple @@ -162,8 +162,8 @@ // __tuple_leaf template ::value -#if __has_feature(is_final) - && !__is_final(_Hp) +#if defined(_LIBCPP_HAS_IS_FINAL) + && !is_final<_Hp>::value #endif > class __tuple_leaf; Index: include/type_traits =================================================================== --- include/type_traits +++ include/type_traits @@ -796,8 +796,8 @@ // is_final -#if _LIBCPP_STD_VER > 11 && __has_feature(is_final) -template struct _LIBCPP_TYPE_VIS_ONLY +#if defined(_LIBCPP_HAS_IS_FINAL) +template struct _LIBCPP_TYPE_VIS_ONLY is_final : public integral_constant {}; #endif Index: include/unordered_map =================================================================== --- include/unordered_map +++ include/unordered_map @@ -362,8 +362,8 @@ _LIBCPP_BEGIN_NAMESPACE_STD template ::value -#if __has_feature(is_final) - && !__is_final(_Hash) +#if defined(_LIBCPP_HAS_IS_FINAL) + && !is_final<_Hash>::value #endif > class __unordered_map_hasher @@ -413,8 +413,8 @@ }; template ::value -#if __has_feature(is_final) - && !__is_final(_Pred) +#if defined(_LIBCPP_HAS_IS_FINAL) + && !is_final<_Pred>::value #endif > class __unordered_map_equal