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<CopyConstructible Fn, CopyConstructible... Types>
13//   unspecified bind(Fn, Types...);
14// template<Returnable R, CopyConstructible Fn, CopyConstructible... Types>
15//   unspecified bind(Fn, Types...);
16
17#include <functional>
18#include <cassert>
19
20int count = 0;
21
22template <class F>
23void
24test(F f)
25{
26    int save_count = count;
27    f();
28    assert(count == save_count + 1);
29}
30
31template <class F>
32void
33test_const(const F& f)
34{
35    int save_count = count;
36    f();
37    assert(count == save_count + 2);
38}
39
40void f() {++count;}
41
42struct A_int_0
43{
44    void operator()() {++count;}
45    void operator()() const {count += 2;}
46};
47
48int main()
49{
50    test(std::bind(f));
51    test(std::bind(&f));
52    test(std::bind(A_int_0()));
53    test_const(std::bind(A_int_0()));
54
55    test(std::bind<void>(f));
56    test(std::bind<void>(&f));
57    test(std::bind<void>(A_int_0()));
58    test_const(std::bind<void>(A_int_0()));
59}
60