1 //===----------------------------------------------------------------------===//
2 //
3 // The LLVM Compiler Infrastructure
4 //
5 // This file is dual licensed under the MIT and the University of Illinois Open
6 // Source Licenses. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9
10 // <functional>
11
12 // template<class R, class ...Args>
13 // function(R(*)(Args...)) -> function<R(Args...)>;
14
15 // UNSUPPORTED: c++03, c++11, c++14
16
17 #include <functional>
18 #include <type_traits>
19
20 #include "test_macros.h"
21
22 struct R { };
23 struct A1 { };
24 struct A2 { };
25 struct A3 { };
26
f0()27 R f0() { return {}; }
f1(A1)28 R f1(A1) { return {}; }
f2(A1,A2)29 R f2(A1, A2) { return {}; }
f3(A1,A2,A3)30 R f3(A1, A2, A3) { return {}; }
f4(A1={})31 R f4(A1 = {}) { return {}; }
32
main(int,char **)33 int main(int, char**) {
34 {
35 // implicit
36 std::function a = f0;
37 ASSERT_SAME_TYPE(decltype(a), std::function<R()>);
38
39 std::function b = &f0;
40 ASSERT_SAME_TYPE(decltype(b), std::function<R()>);
41
42 // explicit
43 std::function c{f0};
44 ASSERT_SAME_TYPE(decltype(c), std::function<R()>);
45
46 std::function d{&f0};
47 ASSERT_SAME_TYPE(decltype(d), std::function<R()>);
48 }
49 {
50 // implicit
51 std::function a = f1;
52 ASSERT_SAME_TYPE(decltype(a), std::function<R(A1)>);
53
54 std::function b = &f1;
55 ASSERT_SAME_TYPE(decltype(b), std::function<R(A1)>);
56
57 // explicit
58 std::function c{f1};
59 ASSERT_SAME_TYPE(decltype(c), std::function<R(A1)>);
60
61 std::function d{&f1};
62 ASSERT_SAME_TYPE(decltype(d), std::function<R(A1)>);
63 }
64 {
65 // implicit
66 std::function a = f2;
67 ASSERT_SAME_TYPE(decltype(a), std::function<R(A1, A2)>);
68
69 std::function b = &f2;
70 ASSERT_SAME_TYPE(decltype(b), std::function<R(A1, A2)>);
71
72 // explicit
73 std::function c{f2};
74 ASSERT_SAME_TYPE(decltype(c), std::function<R(A1, A2)>);
75
76 std::function d{&f2};
77 ASSERT_SAME_TYPE(decltype(d), std::function<R(A1, A2)>);
78 }
79 {
80 // implicit
81 std::function a = f3;
82 ASSERT_SAME_TYPE(decltype(a), std::function<R(A1, A2, A3)>);
83
84 std::function b = &f3;
85 ASSERT_SAME_TYPE(decltype(b), std::function<R(A1, A2, A3)>);
86
87 // explicit
88 std::function c{f3};
89 ASSERT_SAME_TYPE(decltype(c), std::function<R(A1, A2, A3)>);
90
91 std::function d{&f3};
92 ASSERT_SAME_TYPE(decltype(d), std::function<R(A1, A2, A3)>);
93 }
94 // Make sure defaulted arguments don't mess up the deduction
95 {
96 // implicit
97 std::function a = f4;
98 ASSERT_SAME_TYPE(decltype(a), std::function<R(A1)>);
99
100 std::function b = &f4;
101 ASSERT_SAME_TYPE(decltype(b), std::function<R(A1)>);
102
103 // explicit
104 std::function c{f4};
105 ASSERT_SAME_TYPE(decltype(c), std::function<R(A1)>);
106
107 std::function d{&f4};
108 ASSERT_SAME_TYPE(decltype(d), std::function<R(A1)>);
109 }
110
111 return 0;
112 }
113