diff --git a/libstdc++-v3/include/bits/unique_ptr.h b/libstdc++-v3/include/bits/unique_ptr.h index e1ad7721a59..777c7dec15a 100644 --- a/libstdc++-v3/include/bits/unique_ptr.h +++ b/libstdc++-v3/include/bits/unique_ptr.h @@ -172,7 +172,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION __uniq_ptr_impl() = default; _GLIBCXX23_CONSTEXPR - __uniq_ptr_impl(pointer __p) : _M_t() { _M_ptr() = __p; } + __uniq_ptr_impl(pointer __p) : _M_t(__p) { } template _GLIBCXX23_CONSTEXPR @@ -193,13 +193,13 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION } _GLIBCXX23_CONSTEXPR - pointer& _M_ptr() noexcept { return std::get<0>(_M_t); } + pointer& _M_ptr() noexcept { return _M_t._M_ptr(); } _GLIBCXX23_CONSTEXPR - pointer _M_ptr() const noexcept { return std::get<0>(_M_t); } + pointer _M_ptr() const noexcept { return _M_t._M_ptr(); } _GLIBCXX23_CONSTEXPR - _Dp& _M_deleter() noexcept { return std::get<1>(_M_t); } + _Dp& _M_deleter() noexcept { return _M_t._M_deleter(); } _GLIBCXX23_CONSTEXPR - const _Dp& _M_deleter() const noexcept { return std::get<1>(_M_t); } + const _Dp& _M_deleter() const noexcept { return _M_t._M_deleter(); } _GLIBCXX23_CONSTEXPR void reset(pointer __p) noexcept @@ -226,9 +226,35 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION swap(this->_M_ptr(), __rhs._M_ptr()); swap(this->_M_deleter(), __rhs._M_deleter()); } - private: - tuple _M_t; + struct _Tuple : _Head_base<1, _Dp>, _Head_base<0, pointer> + { + using _Ptr_base = _Head_base<0, pointer>; + using _Del_base = _Head_base<1, _Dp>; + + _Tuple() = default; + _Tuple(_Tuple&&) = default; + + constexpr + _Tuple(pointer __p) : _Ptr_base(__p) { } + + template + constexpr + _Tuple(pointer __p, _Del&& __d) + : _Del_base(std::forward<_Del>(__d)), _Ptr_base(__p) + { } + + constexpr pointer& + _M_ptr() noexcept { return _Ptr_base::_M_head(*this); } + constexpr pointer + _M_ptr() const noexcept { return _Ptr_base::_M_head(*this); } + constexpr _Dp& + _M_deleter() noexcept { return _Del_base::_M_head(*this); } + constexpr const _Dp& + _M_deleter() const noexcept { return _Del_base::_M_head(*this); } + }; + + _Tuple _M_t; }; // Defines move construction + assignment as either defaulted or deleted.