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