From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 2181) id 772DE385801B; Mon, 25 Apr 2022 16:05:48 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 772DE385801B MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="utf-8" From: Jonathan Wakely To: gcc-cvs@gcc.gnu.org, libstdc++-cvs@gcc.gnu.org Subject: [gcc r12-8249] libstdc++: Add deduction guides for std::packaged_task [PR105375] X-Act-Checkin: gcc X-Git-Author: Jonathan Wakely X-Git-Refname: refs/heads/master X-Git-Oldrev: 1ba397e9f93d3abc93a6ecbabc3d873489a6fb7f X-Git-Newrev: a5cee0480c10bafa8ed65d49e5cedca23d98d7b7 Message-Id: <20220425160548.772DE385801B@sourceware.org> Date: Mon, 25 Apr 2022 16:05:48 +0000 (GMT) X-BeenThere: libstdc++-cvs@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libstdc++-cvs mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 25 Apr 2022 16:05:48 -0000 https://gcc.gnu.org/g:a5cee0480c10bafa8ed65d49e5cedca23d98d7b7 commit r12-8249-ga5cee0480c10bafa8ed65d49e5cedca23d98d7b7 Author: Jonathan Wakely Date: Mon Apr 25 14:22:41 2022 +0100 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: --- libstdc++-v3/include/std/future | 11 +++ .../30_threads/packaged_task/cons/deduction.cc | 85 ++++++++++++++++++++++ 2 files changed, 96 insertions(+) diff --git a/libstdc++-v3/include/std/future b/libstdc++-v3/include/std/future index cba40dc0883..a9268cade91 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 00000000000..0eb69763ab9 --- /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); +}