diff --git a/libcxx/include/memory b/libcxx/include/memory --- a/libcxx/include/memory +++ b/libcxx/include/memory @@ -1352,27 +1352,16 @@ #endif // _LIBCPP_CXX03_LANG -#if !defined(_LIBCPP_CXX03_LANG) +template ().construct(_VSTD::declval<_Args>()...))> +static true_type __test_has_construct(int); +template +static false_type __test_has_construct(...); -_LIBCPP_SUPPRESS_DEPRECATED_PUSH -template -auto -__has_construct_test(_Alloc&& __a, _Tp* __p, _Args&&... __args) - -> decltype(__a.construct(__p, _VSTD::forward<_Args>(__args)...), true_type()); -_LIBCPP_SUPPRESS_DEPRECATED_POP +template +struct __has_construct : decltype(__test_has_construct<_Alloc, _Args...>(0)) {}; -template -auto -__has_construct_test(const _Alloc& __a, _Pointer&& __p, _Args&& ...__args) - -> false_type; - -template -struct __has_construct - : decltype(_VSTD::__has_construct_test(declval<_Alloc>(), - declval<_Pointer>(), - declval<_Args>()...)) -{ -}; +#if !defined(_LIBCPP_CXX03_LANG) _LIBCPP_SUPPRESS_DEPRECATED_PUSH template @@ -1429,14 +1418,6 @@ #else // _LIBCPP_CXX03_LANG -template -struct __has_construct : std::false_type {}; - -template -struct __has_construct<_Alloc, _Pointer, _Tp, typename __void_t< - decltype(_VSTD::declval<_Alloc>().construct(_VSTD::declval<_Pointer>(), _VSTD::declval<_Tp>())) ->::type> : std::true_type {}; - template struct __has_destroy : false_type {}; @@ -1548,41 +1529,11 @@ static void deallocate(allocator_type& __a, pointer __p, size_type __n) _NOEXCEPT {__a.deallocate(__p, __n);} -#ifndef _LIBCPP_HAS_NO_VARIADICS template _LIBCPP_INLINE_VISIBILITY static void construct(allocator_type& __a, _Tp* __p, _Args&&... __args) {__construct(__has_construct(), __a, __p, _VSTD::forward<_Args>(__args)...);} -#else // _LIBCPP_HAS_NO_VARIADICS - template - _LIBCPP_INLINE_VISIBILITY - static void construct(allocator_type&, _Tp* __p) - { - ::new ((void*)__p) _Tp(); - } - template - _LIBCPP_INLINE_VISIBILITY - static void construct(allocator_type& __a, _Tp* __p, const _A0& __a0) - { - __construct(__has_construct(), - __a, __p, __a0); - } - template - _LIBCPP_INLINE_VISIBILITY - static void construct(allocator_type&, _Tp* __p, const _A0& __a0, - const _A1& __a1) - { - ::new ((void*)__p) _Tp(__a0, __a1); - } - template - _LIBCPP_INLINE_VISIBILITY - static void construct(allocator_type&, _Tp* __p, const _A0& __a0, - const _A1& __a1, const _A2& __a2) - { - ::new ((void*)__p) _Tp(__a0, __a1, __a2); - } -#endif // _LIBCPP_HAS_NO_VARIADICS template _LIBCPP_INLINE_VISIBILITY @@ -1725,7 +1676,6 @@ const_void_pointer, false_type) {return __a.allocate(__n);} -#ifndef _LIBCPP_HAS_NO_VARIADICS template _LIBCPP_INLINE_VISIBILITY static void __construct(true_type, allocator_type& __a, _Tp* __p, _Args&&... __args) @@ -1741,20 +1691,6 @@ { ::new ((void*)__p) _Tp(_VSTD::forward<_Args>(__args)...); } -#else // _LIBCPP_HAS_NO_VARIADICS - template - _LIBCPP_INLINE_VISIBILITY - static void __construct(true_type, allocator_type& __a, _Tp* __p, - const _A0& __a0) - {__a.construct(__p, __a0);} - template - _LIBCPP_INLINE_VISIBILITY - static void __construct(false_type, allocator_type&, _Tp* __p, - const _A0& __a0) - { - ::new ((void*)__p) _Tp(__a0); - } -#endif // _LIBCPP_HAS_NO_VARIADICS template _LIBCPP_INLINE_VISIBILITY