diff options
author | Zoe Carver <z.zoelec2@gmail.com> | 2019-08-19 15:47:16 +0000 |
---|---|---|
committer | Zoe Carver <z.zoelec2@gmail.com> | 2019-08-19 15:47:16 +0000 |
commit | 471bbb6e72830ad24d8079c5ee2acf0ec1fac961 (patch) | |
tree | 06e4bee1e34c6616d1aa2a6d5bff9364c46de2eb /libcxx/include | |
parent | 08c77b97c0620b3d8e058e4780bb4f62d81c5958 (diff) | |
download | bcm5719-llvm-471bbb6e72830ad24d8079c5ee2acf0ec1fac961.tar.gz bcm5719-llvm-471bbb6e72830ad24d8079c5ee2acf0ec1fac961.zip |
[libc++] reverts commit a5f5aad568bb7a91ceee47641f3076ac339ef8c7.
The commit being reverted caused segfaults when building
with libc++ and GCC (and possibly other configurations).
Differential Revision: https://reviews.llvm.org/D62868
llvm-svn: 369270
Diffstat (limited to 'libcxx/include')
-rw-r--r-- | libcxx/include/memory | 370 |
1 files changed, 260 insertions, 110 deletions
diff --git a/libcxx/include/memory b/libcxx/include/memory index a9a5cc93084..321d5fee12a 100644 --- a/libcxx/include/memory +++ b/libcxx/include/memory @@ -3831,16 +3831,48 @@ public: : nullptr);} #endif // _LIBCPP_NO_RTTI - template<class _Yp, class _CntrlBlk> - static shared_ptr<_Tp> - __create_with_cntrl_block(_Yp* __p, _CntrlBlk* __cntrl) - { - shared_ptr<_Tp> __r; - __r.__ptr_ = __p; - __r.__cntrl_ = __cntrl; - __r.__enable_weak_this(__r.__ptr_, __r.__ptr_); - return __r; - } +#ifndef _LIBCPP_HAS_NO_VARIADICS + + template<class ..._Args> + static + shared_ptr<_Tp> + make_shared(_Args&& ...__args); + + template<class _Alloc, class ..._Args> + static + shared_ptr<_Tp> + allocate_shared(const _Alloc& __a, _Args&& ...__args); + +#else // _LIBCPP_HAS_NO_VARIADICS + + static shared_ptr<_Tp> make_shared(); + + template<class _A0> + static shared_ptr<_Tp> make_shared(_A0&); + + template<class _A0, class _A1> + static shared_ptr<_Tp> make_shared(_A0&, _A1&); + + template<class _A0, class _A1, class _A2> + static shared_ptr<_Tp> make_shared(_A0&, _A1&, _A2&); + + template<class _Alloc> + static shared_ptr<_Tp> + allocate_shared(const _Alloc& __a); + + template<class _Alloc, class _A0> + static shared_ptr<_Tp> + allocate_shared(const _Alloc& __a, _A0& __a0); + + template<class _Alloc, class _A0, class _A1> + static shared_ptr<_Tp> + allocate_shared(const _Alloc& __a, _A0& __a0, _A1& __a1); + + template<class _Alloc, class _A0, class _A1, class _A2> + static shared_ptr<_Tp> + allocate_shared(const _Alloc& __a, _A0& __a0, _A1& __a1, _A2& __a2); + +#endif // _LIBCPP_HAS_NO_VARIADICS private: template <class _Yp, bool = is_function<_Yp>::value> @@ -4154,6 +4186,206 @@ shared_ptr<_Tp>::shared_ptr(unique_ptr<_Yp, _Dp> __r, __r.release(); } +#ifndef _LIBCPP_HAS_NO_VARIADICS + +template<class _Tp> +template<class ..._Args> +shared_ptr<_Tp> +shared_ptr<_Tp>::make_shared(_Args&& ...__args) +{ + static_assert( is_constructible<_Tp, _Args...>::value, "Can't construct object in make_shared" ); + typedef __shared_ptr_emplace<_Tp, allocator<_Tp> > _CntrlBlk; + typedef allocator<_CntrlBlk> _A2; + typedef __allocator_destructor<_A2> _D2; + _A2 __a2; + unique_ptr<_CntrlBlk, _D2> __hold2(__a2.allocate(1), _D2(__a2, 1)); + ::new(__hold2.get()) _CntrlBlk(__a2, _VSTD::forward<_Args>(__args)...); + shared_ptr<_Tp> __r; + __r.__ptr_ = __hold2.get()->get(); + __r.__cntrl_ = __hold2.release(); + __r.__enable_weak_this(__r.__ptr_, __r.__ptr_); + return __r; +} + +template<class _Tp> +template<class _Alloc, class ..._Args> +shared_ptr<_Tp> +shared_ptr<_Tp>::allocate_shared(const _Alloc& __a, _Args&& ...__args) +{ + static_assert( is_constructible<_Tp, _Args...>::value, "Can't construct object in allocate_shared" ); + typedef __shared_ptr_emplace<_Tp, _Alloc> _CntrlBlk; + typedef typename __allocator_traits_rebind<_Alloc, _CntrlBlk>::type _A2; + typedef __allocator_destructor<_A2> _D2; + _A2 __a2(__a); + unique_ptr<_CntrlBlk, _D2> __hold2(__a2.allocate(1), _D2(__a2, 1)); + ::new(static_cast<void*>(_VSTD::addressof(*__hold2.get()))) + _CntrlBlk(__a, _VSTD::forward<_Args>(__args)...); + shared_ptr<_Tp> __r; + __r.__ptr_ = __hold2.get()->get(); + __r.__cntrl_ = _VSTD::addressof(*__hold2.release()); + __r.__enable_weak_this(__r.__ptr_, __r.__ptr_); + return __r; +} + +#else // _LIBCPP_HAS_NO_VARIADICS + +template<class _Tp> +shared_ptr<_Tp> +shared_ptr<_Tp>::make_shared() +{ + static_assert((is_constructible<_Tp>::value), "Can't construct object in make_shared" ); + typedef __shared_ptr_emplace<_Tp, allocator<_Tp> > _CntrlBlk; + typedef allocator<_CntrlBlk> _Alloc2; + typedef __allocator_destructor<_Alloc2> _D2; + _Alloc2 __alloc2; + unique_ptr<_CntrlBlk, _D2> __hold2(__alloc2.allocate(1), _D2(__alloc2, 1)); + ::new(__hold2.get()) _CntrlBlk(__alloc2); + shared_ptr<_Tp> __r; + __r.__ptr_ = __hold2.get()->get(); + __r.__cntrl_ = __hold2.release(); + __r.__enable_weak_this(__r.__ptr_, __r.__ptr_); + return __r; +} + +template<class _Tp> +template<class _A0> +shared_ptr<_Tp> +shared_ptr<_Tp>::make_shared(_A0& __a0) +{ + static_assert((is_constructible<_Tp, _A0>::value), "Can't construct object in make_shared" ); + typedef __shared_ptr_emplace<_Tp, allocator<_Tp> > _CntrlBlk; + typedef allocator<_CntrlBlk> _Alloc2; + typedef __allocator_destructor<_Alloc2> _D2; + _Alloc2 __alloc2; + unique_ptr<_CntrlBlk, _D2> __hold2(__alloc2.allocate(1), _D2(__alloc2, 1)); + ::new(__hold2.get()) _CntrlBlk(__alloc2, __a0); + shared_ptr<_Tp> __r; + __r.__ptr_ = __hold2.get()->get(); + __r.__cntrl_ = __hold2.release(); + __r.__enable_weak_this(__r.__ptr_, __r.__ptr_); + return __r; +} + +template<class _Tp> +template<class _A0, class _A1> +shared_ptr<_Tp> +shared_ptr<_Tp>::make_shared(_A0& __a0, _A1& __a1) +{ + static_assert((is_constructible<_Tp, _A0, _A1>::value), "Can't construct object in make_shared" ); + typedef __shared_ptr_emplace<_Tp, allocator<_Tp> > _CntrlBlk; + typedef allocator<_CntrlBlk> _Alloc2; + typedef __allocator_destructor<_Alloc2> _D2; + _Alloc2 __alloc2; + unique_ptr<_CntrlBlk, _D2> __hold2(__alloc2.allocate(1), _D2(__alloc2, 1)); + ::new(__hold2.get()) _CntrlBlk(__alloc2, __a0, __a1); + shared_ptr<_Tp> __r; + __r.__ptr_ = __hold2.get()->get(); + __r.__cntrl_ = __hold2.release(); + __r.__enable_weak_this(__r.__ptr_, __r.__ptr_); + return __r; +} + +template<class _Tp> +template<class _A0, class _A1, class _A2> +shared_ptr<_Tp> +shared_ptr<_Tp>::make_shared(_A0& __a0, _A1& __a1, _A2& __a2) +{ + static_assert((is_constructible<_Tp, _A0, _A1, _A2>::value), "Can't construct object in make_shared" ); + typedef __shared_ptr_emplace<_Tp, allocator<_Tp> > _CntrlBlk; + typedef allocator<_CntrlBlk> _Alloc2; + typedef __allocator_destructor<_Alloc2> _D2; + _Alloc2 __alloc2; + unique_ptr<_CntrlBlk, _D2> __hold2(__alloc2.allocate(1), _D2(__alloc2, 1)); + ::new(__hold2.get()) _CntrlBlk(__alloc2, __a0, __a1, __a2); + shared_ptr<_Tp> __r; + __r.__ptr_ = __hold2.get()->get(); + __r.__cntrl_ = __hold2.release(); + __r.__enable_weak_this(__r.__ptr_, __r.__ptr_); + return __r; +} + +template<class _Tp> +template<class _Alloc> +shared_ptr<_Tp> +shared_ptr<_Tp>::allocate_shared(const _Alloc& __a) +{ + static_assert((is_constructible<_Tp>::value), "Can't construct object in allocate_shared" ); + typedef __shared_ptr_emplace<_Tp, _Alloc> _CntrlBlk; + typedef typename __allocator_traits_rebind<_Alloc, _CntrlBlk>::type _Alloc2; + typedef __allocator_destructor<_Alloc2> _D2; + _Alloc2 __alloc2(__a); + unique_ptr<_CntrlBlk, _D2> __hold2(__alloc2.allocate(1), _D2(__alloc2, 1)); + ::new(static_cast<void*>(_VSTD::addressof(*__hold2.get()))) + _CntrlBlk(__a); + shared_ptr<_Tp> __r; + __r.__ptr_ = __hold2.get()->get(); + __r.__cntrl_ = _VSTD::addressof(*__hold2.release()); + __r.__enable_weak_this(__r.__ptr_, __r.__ptr_); + return __r; +} + +template<class _Tp> +template<class _Alloc, class _A0> +shared_ptr<_Tp> +shared_ptr<_Tp>::allocate_shared(const _Alloc& __a, _A0& __a0) +{ + static_assert((is_constructible<_Tp, _A0>::value), "Can't construct object in allocate_shared" ); + typedef __shared_ptr_emplace<_Tp, _Alloc> _CntrlBlk; + typedef typename __allocator_traits_rebind<_Alloc, _CntrlBlk>::type _Alloc2; + typedef __allocator_destructor<_Alloc2> _D2; + _Alloc2 __alloc2(__a); + unique_ptr<_CntrlBlk, _D2> __hold2(__alloc2.allocate(1), _D2(__alloc2, 1)); + ::new(static_cast<void*>(_VSTD::addressof(*__hold2.get()))) + _CntrlBlk(__a, __a0); + shared_ptr<_Tp> __r; + __r.__ptr_ = __hold2.get()->get(); + __r.__cntrl_ = _VSTD::addressof(*__hold2.release()); + __r.__enable_weak_this(__r.__ptr_, __r.__ptr_); + return __r; +} + +template<class _Tp> +template<class _Alloc, class _A0, class _A1> +shared_ptr<_Tp> +shared_ptr<_Tp>::allocate_shared(const _Alloc& __a, _A0& __a0, _A1& __a1) +{ + static_assert((is_constructible<_Tp, _A0, _A1>::value), "Can't construct object in allocate_shared" ); + typedef __shared_ptr_emplace<_Tp, _Alloc> _CntrlBlk; + typedef typename __allocator_traits_rebind<_Alloc, _CntrlBlk>::type _Alloc2; + typedef __allocator_destructor<_Alloc2> _D2; + _Alloc2 __alloc2(__a); + unique_ptr<_CntrlBlk, _D2> __hold2(__alloc2.allocate(1), _D2(__alloc2, 1)); + ::new(static_cast<void*>(_VSTD::addressof(*__hold2.get()))) + _CntrlBlk(__a, __a0, __a1); + shared_ptr<_Tp> __r; + __r.__ptr_ = __hold2.get()->get(); + __r.__cntrl_ = _VSTD::addressof(*__hold2.release()); + __r.__enable_weak_this(__r.__ptr_, __r.__ptr_); + return __r; +} + +template<class _Tp> +template<class _Alloc, class _A0, class _A1, class _A2> +shared_ptr<_Tp> +shared_ptr<_Tp>::allocate_shared(const _Alloc& __a, _A0& __a0, _A1& __a1, _A2& __a2) +{ + static_assert((is_constructible<_Tp, _A0, _A1, _A2>::value), "Can't construct object in allocate_shared" ); + typedef __shared_ptr_emplace<_Tp, _Alloc> _CntrlBlk; + typedef typename __allocator_traits_rebind<_Alloc, _CntrlBlk>::type _Alloc2; + typedef __allocator_destructor<_Alloc2> _D2; + _Alloc2 __alloc2(__a); + unique_ptr<_CntrlBlk, _D2> __hold2(__alloc2.allocate(1), _D2(__alloc2, 1)); + ::new(static_cast<void*>(_VSTD::addressof(*__hold2.get()))) + _CntrlBlk(__a, __a0, __a1, __a2); + shared_ptr<_Tp> __r; + __r.__ptr_ = __hold2.get()->get(); + __r.__cntrl_ = _VSTD::addressof(*__hold2.release()); + __r.__enable_weak_this(__r.__ptr_, __r.__ptr_); + return __r; +} + +#endif // _LIBCPP_HAS_NO_VARIADICS + template<class _Tp> shared_ptr<_Tp>::~shared_ptr() { @@ -4346,17 +4578,7 @@ typename enable_if >::type make_shared(_Args&& ...__args) { - static_assert(is_constructible<_Tp, _Args...>::value, "Can't construct object in make_shared"); - typedef __shared_ptr_emplace<_Tp, allocator<_Tp> > _CntrlBlk; - typedef allocator<_CntrlBlk> _A2; - typedef __allocator_destructor<_A2> _D2; - - _A2 __a2; - unique_ptr<_CntrlBlk, _D2> __hold2(__a2.allocate(1), _D2(__a2, 1)); - ::new(__hold2.get()) _CntrlBlk(__a2, _VSTD::forward<_Args>(__args)...); - - return shared_ptr<_Tp>::__create_with_cntrl_block(__hold2.get()->get(), - __hold2.release()); + return shared_ptr<_Tp>::make_shared(_VSTD::forward<_Args>(__args)...); } template<class _Tp, class _Alloc, class ..._Args> @@ -4368,145 +4590,73 @@ typename enable_if >::type allocate_shared(const _Alloc& __a, _Args&& ...__args) { - static_assert(is_constructible<_Tp, _Args...>::value, "Can't construct object in allocate_shared"); - - typedef __shared_ptr_emplace<_Tp, _Alloc> _CntrlBlk; - typedef typename __allocator_traits_rebind<_Alloc, _CntrlBlk>::type _A2; - typedef __allocator_destructor<_A2> _D2; - - _A2 __a2(__a); - unique_ptr<_CntrlBlk, _D2> __hold2(__a2.allocate(1), _D2(__a2, 1)); - ::new(static_cast<void*>(_VSTD::addressof(*__hold2.get()))) - _CntrlBlk(__a, _VSTD::forward<_Args>(__args)...); - - return shared_ptr<_Tp>::__create_with_cntrl_block(__hold2.get()->get(), - _VSTD::addressof(*__hold2.release())); + return shared_ptr<_Tp>::allocate_shared(__a, _VSTD::forward<_Args>(__args)...); } #else // _LIBCPP_HAS_NO_VARIADICS template<class _Tp> +inline _LIBCPP_INLINE_VISIBILITY shared_ptr<_Tp> make_shared() { - static_assert((is_constructible<_Tp>::value), "Can't construct object in make_shared" ); - typedef __shared_ptr_emplace<_Tp, allocator<_Tp> > _CntrlBlk; - typedef allocator<_CntrlBlk> _Alloc2; - typedef __allocator_destructor<_Alloc2> _D2; - _Alloc2 __alloc2; - unique_ptr<_CntrlBlk, _D2> __hold2(__alloc2.allocate(1), _D2(__alloc2, 1)); - ::new(__hold2.get()) _CntrlBlk(__alloc2); - return shared_ptr<_Tp>::__create_with_cntrl_block(__hold2.get()->get(), - __hold2.release()); + return shared_ptr<_Tp>::make_shared(); } template<class _Tp, class _A0> +inline _LIBCPP_INLINE_VISIBILITY shared_ptr<_Tp> make_shared(_A0& __a0) { - static_assert((is_constructible<_Tp, _A0>::value), "Can't construct object in make_shared" ); - typedef __shared_ptr_emplace<_Tp, allocator<_Tp> > _CntrlBlk; - typedef allocator<_CntrlBlk> _Alloc2; - typedef __allocator_destructor<_Alloc2> _D2; - _Alloc2 __alloc2; - unique_ptr<_CntrlBlk, _D2> __hold2(__alloc2.allocate(1), _D2(__alloc2, 1)); - ::new(__hold2.get()) _CntrlBlk(__alloc2, __a0); - return shared_ptr<_Tp>::__create_with_cntrl_block(__hold2.get()->get(), - __hold2.release()); + return shared_ptr<_Tp>::make_shared(__a0); } template<class _Tp, class _A0, class _A1> +inline _LIBCPP_INLINE_VISIBILITY shared_ptr<_Tp> make_shared(_A0& __a0, _A1& __a1) { - static_assert((is_constructible<_Tp, _A0, _A1>::value), "Can't construct object in make_shared" ); - typedef __shared_ptr_emplace<_Tp, allocator<_Tp> > _CntrlBlk; - typedef allocator<_CntrlBlk> _Alloc2; - typedef __allocator_destructor<_Alloc2> _D2; - _Alloc2 __alloc2; - unique_ptr<_CntrlBlk, _D2> __hold2(__alloc2.allocate(1), _D2(__alloc2, 1)); - ::new(__hold2.get()) _CntrlBlk(__alloc2, __a0, __a1); - return shared_ptr<_Tp>::__create_with_cntrl_block(__hold2.get()->get(), - __hold2.release()); + return shared_ptr<_Tp>::make_shared(__a0, __a1); } template<class _Tp, class _A0, class _A1, class _A2> +inline _LIBCPP_INLINE_VISIBILITY shared_ptr<_Tp> make_shared(_A0& __a0, _A1& __a1, _A2& __a2) { - static_assert((is_constructible<_Tp, _A0, _A1, _A2>::value), "Can't construct object in make_shared" ); - typedef __shared_ptr_emplace<_Tp, allocator<_Tp> > _CntrlBlk; - typedef allocator<_CntrlBlk> _Alloc2; - typedef __allocator_destructor<_Alloc2> _D2; - _Alloc2 __alloc2; - unique_ptr<_CntrlBlk, _D2> __hold2(__alloc2.allocate(1), _D2(__alloc2, 1)); - ::new(__hold2.get()) _CntrlBlk(__alloc2, __a0, __a1, __a2); - return shared_ptr<_Tp>::__create_with_cntrl_block(__hold2.get()->get(), - __hold2.release()); + return shared_ptr<_Tp>::make_shared(__a0, __a1, __a2); } template<class _Tp, class _Alloc> +inline _LIBCPP_INLINE_VISIBILITY shared_ptr<_Tp> allocate_shared(const _Alloc& __a) { - static_assert((is_constructible<_Tp>::value), "Can't construct object in allocate_shared" ); - typedef __shared_ptr_emplace<_Tp, _Alloc> _CntrlBlk; - typedef typename __allocator_traits_rebind<_Alloc, _CntrlBlk>::type _Alloc2; - typedef __allocator_destructor<_Alloc2> _D2; - _Alloc2 __alloc2(__a); - unique_ptr<_CntrlBlk, _D2> __hold2(__alloc2.allocate(1), _D2(__alloc2, 1)); - ::new(static_cast<void*>(_VSTD::addressof(*__hold2.get()))) - _CntrlBlk(__a); - return shared_ptr<_Tp>::__create_with_cntrl_block(__hold2.get()->get(), - _VSTD::addressof(*__hold2.release())); + return shared_ptr<_Tp>::allocate_shared(__a); } template<class _Tp, class _Alloc, class _A0> +inline _LIBCPP_INLINE_VISIBILITY shared_ptr<_Tp> allocate_shared(const _Alloc& __a, _A0& __a0) { - static_assert((is_constructible<_Tp, _A0>::value), "Can't construct object in allocate_shared" ); - typedef __shared_ptr_emplace<_Tp, _Alloc> _CntrlBlk; - typedef typename __allocator_traits_rebind<_Alloc, _CntrlBlk>::type _Alloc2; - typedef __allocator_destructor<_Alloc2> _D2; - _Alloc2 __alloc2(__a); - unique_ptr<_CntrlBlk, _D2> __hold2(__alloc2.allocate(1), _D2(__alloc2, 1)); - ::new(static_cast<void*>(_VSTD::addressof(*__hold2.get()))) - _CntrlBlk(__a, __a0); - return shared_ptr<_Tp>::__create_with_cntrl_block(__hold2.get()->get(), - _VSTD::addressof(*__hold2.release())); + return shared_ptr<_Tp>::allocate_shared(__a, __a0); } template<class _Tp, class _Alloc, class _A0, class _A1> +inline _LIBCPP_INLINE_VISIBILITY shared_ptr<_Tp> allocate_shared(const _Alloc& __a, _A0& __a0, _A1& __a1) { - static_assert((is_constructible<_Tp, _A0, _A1>::value), "Can't construct object in allocate_shared" ); - typedef __shared_ptr_emplace<_Tp, _Alloc> _CntrlBlk; - typedef typename __allocator_traits_rebind<_Alloc, _CntrlBlk>::type _Alloc2; - typedef __allocator_destructor<_Alloc2> _D2; - _Alloc2 __alloc2(__a); - unique_ptr<_CntrlBlk, _D2> __hold2(__alloc2.allocate(1), _D2(__alloc2, 1)); - ::new(static_cast<void*>(_VSTD::addressof(*__hold2.get()))) - _CntrlBlk(__a, __a0, __a1); - return shared_ptr<_Tp>::__create_with_cntrl_block(__hold2.get()->get(), - _VSTD::addressof(*__hold2.release())); + return shared_ptr<_Tp>::allocate_shared(__a, __a0, __a1); } template<class _Tp, class _Alloc, class _A0, class _A1, class _A2> +inline _LIBCPP_INLINE_VISIBILITY shared_ptr<_Tp> allocate_shared(const _Alloc& __a, _A0& __a0, _A1& __a1, _A2& __a2) { - static_assert((is_constructible<_Tp, _A0, _A1, _A2>::value), "Can't construct object in allocate_shared" ); - typedef __shared_ptr_emplace<_Tp, _Alloc> _CntrlBlk; - typedef typename __allocator_traits_rebind<_Alloc, _CntrlBlk>::type _Alloc2; - typedef __allocator_destructor<_Alloc2> _D2; - _Alloc2 __alloc2(__a); - unique_ptr<_CntrlBlk, _D2> __hold2(__alloc2.allocate(1), _D2(__alloc2, 1)); - ::new(static_cast<void*>(_VSTD::addressof(*__hold2.get()))) - _CntrlBlk(__a, __a0, __a1, __a2); - return shared_ptr<_Tp>::__create_with_cntrl_block(__hold2.get()->get(), - _VSTD::addressof(*__hold2.release())); + return shared_ptr<_Tp>::allocate_shared(__a, __a0, __a1, __a2); } #endif // _LIBCPP_HAS_NO_VARIADICS |