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++98, c++03, c++11, c++14
16 // UNSUPPORTED: libcpp-no-deduction-guides
17 
18 #include <functional>
19 #include <type_traits>
20 
21 #include "test_macros.h"
22 
23 
24 struct R { };
25 struct A1 { };
26 struct A2 { };
27 struct A3 { };
28 
29 R f0() { return {}; }
30 R f1(A1) { return {}; }
31 R f2(A1, A2) { return {}; }
32 R f3(A1, A2, A3) { return {}; }
33 R f4(A1 = {}) { return {}; }
34 
35 int main() {
36   {
37     // implicit
38     std::function a = f0;
39     ASSERT_SAME_TYPE(decltype(a), std::function<R()>);
40 
41     std::function b = &f0;
42     ASSERT_SAME_TYPE(decltype(b), std::function<R()>);
43 
44     // explicit
45     std::function c{f0};
46     ASSERT_SAME_TYPE(decltype(c), std::function<R()>);
47 
48     std::function d{&f0};
49     ASSERT_SAME_TYPE(decltype(d), std::function<R()>);
50   }
51   {
52     // implicit
53     std::function a = f1;
54     ASSERT_SAME_TYPE(decltype(a), std::function<R(A1)>);
55 
56     std::function b = &f1;
57     ASSERT_SAME_TYPE(decltype(b), std::function<R(A1)>);
58 
59     // explicit
60     std::function c{f1};
61     ASSERT_SAME_TYPE(decltype(c), std::function<R(A1)>);
62 
63     std::function d{&f1};
64     ASSERT_SAME_TYPE(decltype(d), std::function<R(A1)>);
65   }
66   {
67     // implicit
68     std::function a = f2;
69     ASSERT_SAME_TYPE(decltype(a), std::function<R(A1, A2)>);
70 
71     std::function b = &f2;
72     ASSERT_SAME_TYPE(decltype(b), std::function<R(A1, A2)>);
73 
74     // explicit
75     std::function c{f2};
76     ASSERT_SAME_TYPE(decltype(c), std::function<R(A1, A2)>);
77 
78     std::function d{&f2};
79     ASSERT_SAME_TYPE(decltype(d), std::function<R(A1, A2)>);
80   }
81   {
82     // implicit
83     std::function a = f3;
84     ASSERT_SAME_TYPE(decltype(a), std::function<R(A1, A2, A3)>);
85 
86     std::function b = &f3;
87     ASSERT_SAME_TYPE(decltype(b), std::function<R(A1, A2, A3)>);
88 
89     // explicit
90     std::function c{f3};
91     ASSERT_SAME_TYPE(decltype(c), std::function<R(A1, A2, A3)>);
92 
93     std::function d{&f3};
94     ASSERT_SAME_TYPE(decltype(d), std::function<R(A1, A2, A3)>);
95   }
96   // Make sure defaulted arguments don't mess up the deduction
97   {
98     // implicit
99     std::function a = f4;
100     ASSERT_SAME_TYPE(decltype(a), std::function<R(A1)>);
101 
102     std::function b = &f4;
103     ASSERT_SAME_TYPE(decltype(b), std::function<R(A1)>);
104 
105     // explicit
106     std::function c{f4};
107     ASSERT_SAME_TYPE(decltype(c), std::function<R(A1)>);
108 
109     std::function d{&f4};
110     ASSERT_SAME_TYPE(decltype(d), std::function<R(A1)>);
111   }
112 }
113