1//===----------------------------------------------------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9// UNSUPPORTED: no-threads
10// UNSUPPORTED: c++03, c++11, c++14
11
12// checks that CTAD works properly
13
14#include <future>
15#include <type_traits>
16
17int func(char*);
18static_assert(std::is_same_v<decltype(std::packaged_task{func}), std::packaged_task<int(char*)>>);
19
20int funcn(char*) noexcept;
21static_assert(std::is_same_v<decltype(std::packaged_task{funcn}), std::packaged_task<int(char*)>>);
22
23template <bool Noexcept>
24struct Callable {
25 int operator()(char*) noexcept(Noexcept);
26};
27static_assert(std::is_same_v<decltype(std::packaged_task{Callable<true>{}}), std::packaged_task<int(char*)>>);
28static_assert(std::is_same_v<decltype(std::packaged_task{Callable<false>{}}), std::packaged_task<int(char*)>>);
29
30template <bool Noexcept>
31struct CallableC {
32 int operator()(char*) const noexcept(Noexcept);
33};
34static_assert(std::is_same_v<decltype(std::packaged_task{CallableC<true>{}}), std::packaged_task<int(char*)>>);
35static_assert(std::is_same_v<decltype(std::packaged_task{CallableC<false>{}}), std::packaged_task<int(char*)>>);
36
37template <bool Noexcept>
38struct CallableV {
39 int operator()(char*) const noexcept(Noexcept);
40};
41static_assert(std::is_same_v<decltype(std::packaged_task{CallableV<true>{}}), std::packaged_task<int(char*)>>);
42static_assert(std::is_same_v<decltype(std::packaged_task{CallableV<false>{}}), std::packaged_task<int(char*)>>);
43
44template <bool Noexcept>
45struct CallableCV {
46 int operator()(char*) const volatile noexcept(Noexcept);
47};
48static_assert(std::is_same_v<decltype(std::packaged_task{CallableCV<true>{}}), std::packaged_task<int(char*)>>);
49static_assert(std::is_same_v<decltype(std::packaged_task{CallableCV<false>{}}), std::packaged_task<int(char*)>>);
50
51template <bool Noexcept>
52struct CallableL {
53 int operator()(char*) & noexcept(Noexcept);
54};
55static_assert(std::is_same_v<decltype(std::packaged_task{CallableL<true>{}}), std::packaged_task<int(char*)>>);
56static_assert(std::is_same_v<decltype(std::packaged_task{CallableL<false>{}}), std::packaged_task<int(char*)>>);
57
58template <bool Noexcept>
59struct CallableCL {
60 int operator()(char*) const & noexcept(Noexcept);
61};
62static_assert(std::is_same_v<decltype(std::packaged_task{CallableCL<true>{}}), std::packaged_task<int(char*)>>);
63static_assert(std::is_same_v<decltype(std::packaged_task{CallableCL<false>{}}), std::packaged_task<int(char*)>>);
64
65template <bool Noexcept>
66struct CallableVL {
67 int operator()(char*) const noexcept(Noexcept);
68};
69static_assert(std::is_same_v<decltype(std::packaged_task{CallableVL<true>{}}), std::packaged_task<int(char*)>>);
70static_assert(std::is_same_v<decltype(std::packaged_task{CallableVL<false>{}}), std::packaged_task<int(char*)>>);
71
72template <bool Noexcept>
73struct CallableCVL {
74 int operator()(char*) const volatile & noexcept(Noexcept);
75};
76static_assert(std::is_same_v<decltype(std::packaged_task{CallableCVL<true>{}}), std::packaged_task<int(char*)>>);
77static_assert(std::is_same_v<decltype(std::packaged_task{CallableCVL<false>{}}), std::packaged_task<int(char*)>>);
78

source code of libcxx/test/std/thread/futures/futures.task/futures.task.members/ctad.compile.pass.cpp