]> git.ipfire.org Git - thirdparty/gcc.git/blame - libstdc++-v3/testsuite/30_threads/packaged_task/cons/deduction.cc
Update copyright years.
[thirdparty/gcc.git] / libstdc++-v3 / testsuite / 30_threads / packaged_task / cons / deduction.cc
CommitLineData
a945c346 1// // Copyright (C) 2017-2024 Free Software Foundation, Inc.
a5cee048
JW
2//
3// This file is part of the GNU ISO C++ Library. This library is free
4// software; you can redistribute it and/or modify it under the
5// terms of the GNU General Public License as published by the
6// Free Software Foundation; either version 3, or (at your option)
7// any later version.
8
9// This library is distributed in the hope that it will be useful,
10// but WITHOUT ANY WARRANTY; without even the implied warranty of
11// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12// GNU General Public License for more details.
13
14// You should have received a copy of the GNU General Public License along
15// with this library; see the file COPYING3. If not see
16// <http://www.gnu.org/licenses/>.
17
18// { dg-do compile { target c++17 } }
19
20#include <future>
21
22template<typename T, typename U> struct require_same;
23template<typename T> struct require_same<T, T> { using type = void; };
24
25template<typename T, typename U>
26 typename require_same<T, U>::type
27 check_type(U&) { }
28
29void f0v();
30void f0vn() noexcept;
31int f0i();
32int f0in() noexcept;
33long f1l(int&);
34long f1ln(double*) noexcept;
35
36void
37test01()
38{
39 std::packaged_task task1{f0v};
40 check_type<std::packaged_task<void()>>(task1);
41
42 std::packaged_task task2{f0vn};
43 check_type<std::packaged_task<void()>>(task2);
44
45 std::packaged_task task3{f0i};
46 check_type<std::packaged_task<int()>>(task3);
47
48 std::packaged_task task4{f0in};
49 check_type<std::packaged_task<int()>>(task4);
50
51 std::packaged_task task5{f1l};
52 check_type<std::packaged_task<long(int&)>>(task5);
53
54 std::packaged_task task6{f1ln};
55 check_type<std::packaged_task<long(double*)>>(task6);
56
57 std::packaged_task task5a{std::move(task5)};
58 check_type<std::packaged_task<long(int&)>>(task5a);
59
60 std::packaged_task task6a{std::move(task6)};
61 check_type<std::packaged_task<long(double*)>>(task6a);
62}
63
64struct X {
65 int operator()(const short&, void*);
66};
67
68struct Y {
69 void operator()(int) const & noexcept;
70};
71
72void
73test02()
74{
75 X x;
76 std::packaged_task task1{x};
77 check_type<std::packaged_task<int(const short&, void*)>>(task1);
78
79 Y y;
80 std::packaged_task task2{y};
81 check_type<std::packaged_task<void(int)>>(task2);
82
83 std::packaged_task task3{[&x](float) -> X& { return x; }};
84 check_type<std::packaged_task<X&(float)>>(task3);
85}