1 //===----------------------------------------------------------------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 // UNSUPPORTED: c++03 10 11 // <functional> 12 13 // template<CopyConstructible Fn, CopyConstructible... Types> 14 // unspecified bind(Fn, Types...); 15 // template<Returnable R, CopyConstructible Fn, CopyConstructible... Types> 16 // unspecified bind(Fn, Types...); 17 18 #include <functional> 19 #include <cassert> 20 21 #include "test_macros.h" 22 23 int count = 0; 24 25 template <class F> 26 void test(F f)27test(F f) 28 { 29 int save_count = count; 30 f(); 31 assert(count == save_count + 1); 32 } 33 34 template <class F> 35 void test_const(const F & f)36test_const(const F& f) 37 { 38 int save_count = count; 39 f(); 40 assert(count == save_count + 2); 41 } 42 f()43void f() {++count;} 44 g()45int g() {++count; return 0;} 46 47 struct A_void_0 48 { operator ()A_void_049 void operator()() {++count;} operator ()A_void_050 void operator()() const {count += 2;} 51 }; 52 53 struct A_int_0 54 { operator ()A_int_055 int operator()() {++count; return 4;} operator ()A_int_056 int operator()() const {count += 2; return 5;} 57 }; 58 main(int,char **)59int main(int, char**) 60 { 61 test(std::bind(f)); 62 test(std::bind(&f)); 63 test(std::bind(A_void_0())); 64 test_const(std::bind(A_void_0())); 65 66 test(std::bind<void>(f)); 67 test(std::bind<void>(&f)); 68 test(std::bind<void>(A_void_0())); 69 test_const(std::bind<void>(A_void_0())); 70 71 test(std::bind<void>(g)); 72 test(std::bind<void>(&g)); 73 test(std::bind<void>(A_int_0())); 74 test_const(std::bind<void>(A_int_0())); 75 76 return 0; 77 } 78