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.
This commit is contained in:
parent
1ba397e9f9
commit
a5cee0480c
@ -1622,6 +1622,17 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
}
|
||||
};
|
||||
|
||||
// _GLIBCXX_RESOLVE_LIB_DEFECTS
|
||||
// 3117. Missing packaged_task deduction guides
|
||||
#if __cpp_deduction_guides >= 201606
|
||||
template<typename _Res, typename... _ArgTypes>
|
||||
packaged_task(_Res(*)(_ArgTypes...)) -> packaged_task<_Res(_ArgTypes...)>;
|
||||
|
||||
template<typename _Fun, typename _Signature = typename
|
||||
__function_guide_helper<decltype(&_Fun::operator())>::type>
|
||||
packaged_task(_Fun) -> packaged_task<_Signature>;
|
||||
#endif
|
||||
|
||||
/// swap
|
||||
template<typename _Res, typename... _ArgTypes>
|
||||
inline void
|
||||
|
@ -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
|
||||
// <http://www.gnu.org/licenses/>.
|
||||
|
||||
// { dg-do compile { target c++17 } }
|
||||
|
||||
#include <future>
|
||||
|
||||
template<typename T, typename U> struct require_same;
|
||||
template<typename T> struct require_same<T, T> { using type = void; };
|
||||
|
||||
template<typename T, typename U>
|
||||
typename require_same<T, U>::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<std::packaged_task<void()>>(task1);
|
||||
|
||||
std::packaged_task task2{f0vn};
|
||||
check_type<std::packaged_task<void()>>(task2);
|
||||
|
||||
std::packaged_task task3{f0i};
|
||||
check_type<std::packaged_task<int()>>(task3);
|
||||
|
||||
std::packaged_task task4{f0in};
|
||||
check_type<std::packaged_task<int()>>(task4);
|
||||
|
||||
std::packaged_task task5{f1l};
|
||||
check_type<std::packaged_task<long(int&)>>(task5);
|
||||
|
||||
std::packaged_task task6{f1ln};
|
||||
check_type<std::packaged_task<long(double*)>>(task6);
|
||||
|
||||
std::packaged_task task5a{std::move(task5)};
|
||||
check_type<std::packaged_task<long(int&)>>(task5a);
|
||||
|
||||
std::packaged_task task6a{std::move(task6)};
|
||||
check_type<std::packaged_task<long(double*)>>(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<std::packaged_task<int(const short&, void*)>>(task1);
|
||||
|
||||
Y y;
|
||||
std::packaged_task task2{y};
|
||||
check_type<std::packaged_task<void(int)>>(task2);
|
||||
|
||||
std::packaged_task task3{[&x](float) -> X& { return x; }};
|
||||
check_type<std::packaged_task<X&(float)>>(task3);
|
||||
}
|
Loading…
Reference in New Issue
Block a user