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