diff --git a/include/memory b/include/memory index d9dda72aa..29fb0703a 100644 --- a/include/memory +++ b/include/memory @@ -3586,10 +3586,10 @@ private: public: weak_ptr(); template weak_ptr(shared_ptr<_Yp> const& __r, - typename enable_if::value, __nat>::type = __nat()); + typename enable_if::value, __nat*>::type = 0); weak_ptr(weak_ptr const& __r); template weak_ptr(weak_ptr<_Yp> const& __r, - typename enable_if::value, __nat>::type = __nat()); + typename enable_if::value, __nat*>::type = 0); ~weak_ptr(); @@ -3640,7 +3640,7 @@ template template inline _LIBCPP_INLINE_VISIBILITY weak_ptr<_Tp>::weak_ptr(shared_ptr<_Yp> const& __r, - typename enable_if::value, __nat>::type) + typename enable_if::value, __nat*>::type) : __ptr_(__r.__ptr_), __cntrl_(__r.__cntrl_) { @@ -3652,7 +3652,7 @@ template template inline _LIBCPP_INLINE_VISIBILITY weak_ptr<_Tp>::weak_ptr(weak_ptr<_Yp> const& __r, - typename enable_if::value, __nat>::type) + typename enable_if::value, __nat*>::type) : __ptr_(__r.__ptr_), __cntrl_(__r.__cntrl_) { diff --git a/include/type_traits b/include/type_traits index 12d102223..dd6a325db 100644 --- a/include/type_traits +++ b/include/type_traits @@ -845,7 +845,15 @@ struct __type_list typedef _Tp _Tail; }; -struct __nat {}; +struct __nat +{ +#ifndef _LIBCPP_HAS_NO_DELETED_FUNCTIONS + __nat() = delete; + __nat(const __nat&) = delete; + __nat& operator=(const __nat&) = delete; + ~__nat() = delete; +#endif +}; template struct __align_type @@ -2775,6 +2783,140 @@ template struct _LIBCPP_VISIBLE is_trivial #ifndef _LIBCPP_HAS_NO_VARIADICS +// Check for complete types + +template struct __check_complete; + +template <> +struct __check_complete<> +{ +}; + +template +struct __check_complete<_H, _T0, _T...> + : private __check_complete<_H>, + private __check_complete<_T0, _T...> +{ +}; + +template +struct __check_complete<_H, _H> + : private __check_complete<_H> +{ +}; + +template +struct __check_complete<_T> +{ + static_assert(sizeof(_T) > 0, "Type must be complete."); +}; + +template +struct __check_complete<_T&> + : private __check_complete<_T> +{ +}; + +template +struct __check_complete<_T&&> + : private __check_complete<_T> +{ +}; + +template +struct __check_complete<_R (*)(_Param...)> + : private __check_complete<_Param...> +{ +}; + +template +struct __check_complete<_R (_Param...)> + : private __check_complete<_Param...> +{ +}; + +template +struct __check_complete<_R (_Class::*)(_Param...)> + : private __check_complete<_Class, _Param...> +{ +}; + +template +struct __check_complete<_R (_Class::*)(_Param...) const> + : private __check_complete<_Class, _Param...> +{ +}; + +template +struct __check_complete<_R (_Class::*)(_Param...) volatile> + : private __check_complete<_Class, _Param...> +{ +}; + +template +struct __check_complete<_R (_Class::*)(_Param...) const volatile> + : private __check_complete<_Class, _Param...> +{ +}; + +#if __has_feature(cxx_reference_qualified_functions) + +template +struct __check_complete<_R (_Class::*)(_Param...) &> + : private __check_complete<_Class, _Param...> +{ +}; + +template +struct __check_complete<_R (_Class::*)(_Param...) const&> + : private __check_complete<_Class, _Param...> +{ +}; + +template +struct __check_complete<_R (_Class::*)(_Param...) volatile&> + : private __check_complete<_Class, _Param...> +{ +}; + +template +struct __check_complete<_R (_Class::*)(_Param...) const volatile&> + : private __check_complete<_Class, _Param...> +{ +}; + +template +struct __check_complete<_R (_Class::*)(_Param...) &&> + : private __check_complete<_Class, _Param...> +{ +}; + +template +struct __check_complete<_R (_Class::*)(_Param...) const&&> + : private __check_complete<_Class, _Param...> +{ +}; + +template +struct __check_complete<_R (_Class::*)(_Param...) volatile&&> + : private __check_complete<_Class, _Param...> +{ +}; + +template +struct __check_complete<_R (_Class::*)(_Param...) const volatile&&> + : private __check_complete<_Class, _Param...> +{ +}; + +#endif + +template +struct __check_complete<_R _Class::*> + : private __check_complete<_Class> +{ +}; + // __invoke forward declarations // fall back - none of the bullets @@ -2819,6 +2961,7 @@ __invoke(_F&& __f, _Args&& ...__args) template struct __invokable_imp + : private __check_complete<_F, _Args...> { typedef decltype( __invoke(_STD::declval<_F>(), _STD::declval<_Args>()...)