PR libstdc++/80316 make promise::set_value throw no_state error
authorJonathan Wakely <jwakely@redhat.com>
Fri, 21 Apr 2017 14:49:19 +0000 (15:49 +0100)
committerJonathan Wakely <redi@gcc.gnu.org>
Fri, 21 Apr 2017 14:49:19 +0000 (15:49 +0100)
commit946ecd6ab2e0303070800f527f629f1e148a1bb3
treef779fe7290890be0edb3ec56ca625f3311448394
parenta2c0a1942c16c58b39024aaecba443b84b3ad8f6
PR libstdc++/80316 make promise::set_value throw no_state error

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.

From-SVN: r247064
libstdc++-v3/ChangeLog
libstdc++-v3/include/std/future
libstdc++-v3/testsuite/30_threads/promise/members/at_thread_exit2.cc [new file with mode: 0644]
libstdc++-v3/testsuite/30_threads/promise/members/set_exception.cc
libstdc++-v3/testsuite/30_threads/promise/members/set_exception2.cc
libstdc++-v3/testsuite/30_threads/promise/members/set_value2.cc