This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] PR libstdc++/80316 make promise::set_value throw no_state error


On 11/07/17 12:53 +0100, Jonathan Wakely wrote:
On 21/04/17 15:54 +0100, Jonathan Wakely wrote:
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.

And now also to gcc-7-branch.

And gcc-6-branch.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]