]> git.ipfire.org Git - thirdparty/gcc.git/blob - 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
1 // // Copyright (C) 2017-2023 Free Software Foundation, Inc.
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
22 template<typename T, typename U> struct require_same;
23 template<typename T> struct require_same<T, T> { using type = void; };
24
25 template<typename T, typename U>
26 typename require_same<T, U>::type
27 check_type(U&) { }
28
29 void f0v();
30 void f0vn() noexcept;
31 int f0i();
32 int f0in() noexcept;
33 long f1l(int&);
34 long f1ln(double*) noexcept;
35
36 void
37 test01()
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
64 struct X {
65 int operator()(const short&, void*);
66 };
67
68 struct Y {
69 void operator()(int) const & noexcept;
70 };
71
72 void
73 test02()
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 }