diff options
author | Jonathan Wakely <jwakely@redhat.com> | 2025-03-10 14:29:36 +0000 |
---|---|---|
committer | Jonathan Wakely <redi@gcc.gnu.org> | 2025-03-12 17:02:12 +0000 |
commit | 4d2683b04fd329c97e3da09498345fe3ee00455f (patch) | |
tree | a17142ac9e1914ebecd58cb7dc525acb735943f5 /libstdc++-v3/include/std/future | |
parent | 0ce4c1c48564e465a331c100e757e2258b4c632a (diff) | |
download | gcc-4d2683b04fd329c97e3da09498345fe3ee00455f.zip gcc-4d2683b04fd329c97e3da09498345fe3ee00455f.tar.gz gcc-4d2683b04fd329c97e3da09498345fe3ee00455f.tar.bz2 |
libstdc++: Add static_assert to std::packaged_task::packaged_task(F&&)
LWG 4154 (approved in Wrocław, November 2024) fixed the Mandates:
precondition for std::packaged_task::packaged_task(F&&) to match what
the implementation actually requires. We already gave a diagnostic in
the right cases as required by the issue resolution, so strictly
speaking we don't need to do anything. But the current diagnostic comes
from inside the implementation of std::__invoke_r and could be more
user-friendly.
For C++17 (when std::is_invocable_r_v is available) add a static_assert
to the constructor, so the error is clear:
.../include/c++/15.0.1/future: In instantiation of 'std::packaged_task<_Res(_ArgTypes ...)>::packaged_task(_Fn&&) [with _Fn = const F&; <template-parameter-2-2> = void; _Res = void; _ArgTypes = {}]':
lwg4154_neg.cc:15:31: required from here
15 | std::packaged_task<void()> p(f); // { dg-error "here" "" { target c++17 } }
| ^
.../include/c++/15.0.1/future:1575:25: error: static assertion failed
1575 | static_assert(is_invocable_r_v<_Res, decay_t<_Fn>&, _ArgTypes...>);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Also add a test to confirm we get a diagnostic as the standard requires.
libstdc++-v3/ChangeLog:
* include/std/future (packaged_task::packaged_task(F&&)): Add
static_assert.
* testsuite/30_threads/packaged_task/cons/dangling_ref.cc: Add
dg-error for new static assertion.
* testsuite/30_threads/packaged_task/cons/lwg4154_neg.cc: New
test.
Reviewed-by: Tomasz Kamiński <tkaminsk@redhat.com>
Diffstat (limited to 'libstdc++-v3/include/std/future')
-rw-r--r-- | libstdc++-v3/include/std/future | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/libstdc++-v3/include/std/future b/libstdc++-v3/include/std/future index 2a855f2..b7ab233 100644 --- a/libstdc++-v3/include/std/future +++ b/libstdc++-v3/include/std/future @@ -1567,7 +1567,14 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION packaged_task(_Fn&& __fn) : _M_state( __create_task_state<_Res(_ArgTypes...)>(std::forward<_Fn>(__fn))) - { } + { +#ifdef __cpp_lib_is_invocable // C++ >= 17 + // _GLIBCXX_RESOLVE_LIB_DEFECTS + // 4154. The Mandates for std::packaged_task's constructor + // from a callable entity should consider decaying + static_assert(is_invocable_r_v<_Res, decay_t<_Fn>&, _ArgTypes...>); +#endif + } #if __cplusplus < 201703L // _GLIBCXX_RESOLVE_LIB_DEFECTS |