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