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 
27 R f0() { return {}; }
28 R f1(A1) { return {}; }
29 R f2(A1, A2) { return {}; }
30 R f3(A1, A2, A3) { return {}; }
31 R f4(A1 = {}) { return {}; }
32 
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