diff --git a/libcxx/include/future b/libcxx/include/future --- a/libcxx/include/future +++ b/libcxx/include/future @@ -1753,7 +1753,7 @@ __packaged_task_base() {} _LIBCPP_INLINE_VISIBILITY virtual ~__packaged_task_base() {} - virtual void __move_to(__packaged_task_base*) _NOEXCEPT = 0; + virtual void __move_to(void*) _NOEXCEPT = 0; virtual void destroy() = 0; virtual void destroy_deallocate() = 0; virtual _Rp operator()(_ArgTypes&& ...) = 0; @@ -1777,7 +1777,7 @@ _LIBCPP_INLINE_VISIBILITY __packaged_task_func(_Fp&& __f, const _Alloc& __a) : __f_(_VSTD::move(__f), __a) {} - virtual void __move_to(__packaged_task_base<_Rp(_ArgTypes...)>*) _NOEXCEPT; + virtual void __move_to(void*) _NOEXCEPT; virtual void destroy(); virtual void destroy_deallocate(); virtual _Rp operator()(_ArgTypes&& ... __args); @@ -1785,8 +1785,7 @@ template void -__packaged_task_func<_Fp, _Alloc, _Rp(_ArgTypes...)>::__move_to( - __packaged_task_base<_Rp(_ArgTypes...)>* __p) _NOEXCEPT +__packaged_task_func<_Fp, _Alloc, _Rp(_ArgTypes...)>::__move_to(void* __p) _NOEXCEPT { ::new (__p) __packaged_task_func(_VSTD::move(__f_.first()), _VSTD::move(__f_.second())); } @@ -1856,10 +1855,10 @@ { if (__f.__f_ == nullptr) __f_ = nullptr; - else if (__f.__f_ == (__base*)&__f.__buf_) + else if (__f.__f_ == (void*)&__f.__buf_) { + __f.__f_->__move_to(&__buf_); __f_ = (__base*)&__buf_; - __f.__f_->__move_to(__f_); } else { @@ -1877,8 +1876,8 @@ typedef __packaged_task_func<_FR, allocator<_FR>, _Rp(_ArgTypes...)> _FF; if (sizeof(_FF) <= sizeof(__buf_)) { + ::new (&__buf_) _FF(_VSTD::forward<_Fp>(__f)); __f_ = (__base*)&__buf_; - ::new (__f_) _FF(_VSTD::forward<_Fp>(__f)); } else { @@ -1920,17 +1919,17 @@ __packaged_task_function<_Rp(_ArgTypes...)>& __packaged_task_function<_Rp(_ArgTypes...)>::operator=(__packaged_task_function&& __f) _NOEXCEPT { - if (__f_ == (__base*)&__buf_) + if (__f_ == (void*)&__buf_) __f_->destroy(); else if (__f_) __f_->destroy_deallocate(); __f_ = nullptr; if (__f.__f_ == nullptr) __f_ = nullptr; - else if (__f.__f_ == (__base*)&__f.__buf_) + else if (__f.__f_ == (void*)&__f.__buf_) { + __f.__f_->__move_to(&__buf_); __f_ = (__base*)&__buf_; - __f.__f_->__move_to(__f_); } else { @@ -1943,7 +1942,7 @@ template __packaged_task_function<_Rp(_ArgTypes...)>::~__packaged_task_function() { - if (__f_ == (__base*)&__buf_) + if (__f_ == (void*)&__buf_) __f_->destroy(); else if (__f_) __f_->destroy_deallocate(); @@ -1953,31 +1952,30 @@ void __packaged_task_function<_Rp(_ArgTypes...)>::swap(__packaged_task_function& __f) _NOEXCEPT { - if (__f_ == (__base*)&__buf_ && __f.__f_ == (__base*)&__f.__buf_) + if (__f_ == (void*)&__buf_ && __f.__f_ == (void*)&__f.__buf_) { typename aligned_storage::type __tempbuf; - __base* __t = (__base*)&__tempbuf; - __f_->__move_to(__t); + __f_->__move_to(&__tempbuf); __f_->destroy(); __f_ = nullptr; - __f.__f_->__move_to((__base*)&__buf_); + __f.__f_->__move_to(&__buf_); __f.__f_->destroy(); __f.__f_ = nullptr; __f_ = (__base*)&__buf_; - __t->__move_to((__base*)&__f.__buf_); - __t->destroy(); + ((__base*)&__tempbuf)->__move_to(&__f.__buf_); + ((__base*)&__tempbuf)->destroy(); __f.__f_ = (__base*)&__f.__buf_; } - else if (__f_ == (__base*)&__buf_) + else if (__f_ == (void*)&__buf_) { - __f_->__move_to((__base*)&__f.__buf_); + __f_->__move_to(&__f.__buf_); __f_->destroy(); __f_ = __f.__f_; __f.__f_ = (__base*)&__f.__buf_; } - else if (__f.__f_ == (__base*)&__f.__buf_) + else if (__f.__f_ == (void*)&__f.__buf_) { - __f.__f_->__move_to((__base*)&__buf_); + __f.__f_->__move_to(&__buf_); __f.__f_->destroy(); __f.__f_ = __f_; __f_ = (__base*)&__buf_;