On 4 April 2017 at 20:44, Jonathan Wakely wrote: > We got a bug report from a customer pointing out that calling > promise::set_value on a moved-from promise crashes instead of throwing > an exception with error code future_errc::no_state. > > This fixes it, by moving the _S_check calls to *before* we deference > the pointer that the calls check! > > This passes all tests, including the more comprehensive ones I've > added as part of this commit, but I think it can wait for stage 1 > anyway. We've been shipping this bug for a couple of releases already. > > PR libstdc++/80316 > * include/std/future (_State_baseV2::_Setter::operator()): Remove > _S_check calls that are done after the pointer to the shared state > is > already dereferenced. > (_State_baseV2::_Setter<_Res, void>): Define specialization for void > as partial specialization so it can be defined within the definition > of _State_baseV2. > (_State_baseV2::__setter): Call _S_check. > (_State_baseV2::__setter(promise<void>*)): Add overload for use by > promise<void>::set_value and > promise<void>::set_value_at_thread_exit. > (promise<T>, promise<T&>, promise<void>): Make _State a friend. > (_State_baseV2::_Setter<void, void>): Remove explicit > specialization. > (promise<void>::set_value, promise<void>::set_value_at_thread_exit): > Use new __setter overload. > * testsuite/30_threads/promise/members/at_thread_exit2.cc: New test. > * testsuite/30_threads/promise/members/set_exception.cc: Test > promise<T&> and promise<void> specializations. > * testsuite/30_threads/promise/members/set_exception2.cc: Likewise. > Test for no_state error condition. > * testsuite/30_threads/promise/members/set_value2.cc: Likewise.
This is now committed to trunk.