This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH] PR libstdc++/80316 make promise::set_value throw no_state error
- From: Jonathan Wakely <jwakely dot gcc at gmail dot com>
- To: "libstdc++" <libstdc++ at gcc dot gnu dot org>, gcc-patches <gcc-patches at gcc dot gnu dot org>
- Date: Fri, 21 Apr 2017 15:54:37 +0100
- Subject: Re: [PATCH] PR libstdc++/80316 make promise::set_value throw no_state error
- Authentication-results: sourceware.org; auth=none
- References: <20170404194421.GA29097@redhat.com>
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.