From: Jonathan Wakely Date: Mon, 25 Apr 2022 13:22:41 +0000 (+0100) Subject: libstdc++: Add deduction guides for std::packaged_task [PR105375] X-Git-Tag: basepoints/gcc-13~64 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=a5cee0480c10bafa8ed65d49e5cedca23d98d7b7;p=thirdparty%2Fgcc.git libstdc++: Add deduction guides for std::packaged_task [PR105375] This change was LWG 3117. The test is copied from 20_util/function/cons/deduction.cc libstdc++-v3/ChangeLog: PR libstdc++/105375 * include/std/future (packaged_task): Add deduction guides. * testsuite/30_threads/packaged_task/cons/deduction.cc: New test. --- diff --git a/libstdc++-v3/include/std/future b/libstdc++-v3/include/std/future index cba40dc08838..a9268cade91a 100644 --- a/libstdc++-v3/include/std/future +++ b/libstdc++-v3/include/std/future @@ -1622,6 +1622,17 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION } }; + // _GLIBCXX_RESOLVE_LIB_DEFECTS + // 3117. Missing packaged_task deduction guides +#if __cpp_deduction_guides >= 201606 + template + packaged_task(_Res(*)(_ArgTypes...)) -> packaged_task<_Res(_ArgTypes...)>; + + template::type> + packaged_task(_Fun) -> packaged_task<_Signature>; +#endif + /// swap template inline void diff --git a/libstdc++-v3/testsuite/30_threads/packaged_task/cons/deduction.cc b/libstdc++-v3/testsuite/30_threads/packaged_task/cons/deduction.cc new file mode 100644 index 000000000000..0eb69763ab98 --- /dev/null +++ b/libstdc++-v3/testsuite/30_threads/packaged_task/cons/deduction.cc @@ -0,0 +1,85 @@ +// // Copyright (C) 2017-2022 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +// { dg-do compile { target c++17 } } + +#include + +template struct require_same; +template struct require_same { using type = void; }; + +template + typename require_same::type + check_type(U&) { } + +void f0v(); +void f0vn() noexcept; +int f0i(); +int f0in() noexcept; +long f1l(int&); +long f1ln(double*) noexcept; + +void +test01() +{ + std::packaged_task task1{f0v}; + check_type>(task1); + + std::packaged_task task2{f0vn}; + check_type>(task2); + + std::packaged_task task3{f0i}; + check_type>(task3); + + std::packaged_task task4{f0in}; + check_type>(task4); + + std::packaged_task task5{f1l}; + check_type>(task5); + + std::packaged_task task6{f1ln}; + check_type>(task6); + + std::packaged_task task5a{std::move(task5)}; + check_type>(task5a); + + std::packaged_task task6a{std::move(task6)}; + check_type>(task6a); +} + +struct X { + int operator()(const short&, void*); +}; + +struct Y { + void operator()(int) const & noexcept; +}; + +void +test02() +{ + X x; + std::packaged_task task1{x}; + check_type>(task1); + + Y y; + std::packaged_task task2{y}; + check_type>(task2); + + std::packaged_task task3{[&x](float) -> X& { return x; }}; + check_type>(task3); +}