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 // class function<R(ArgTypes...)>
13 
14 // function& operator=(nullptr_t);
15 
16 #include <functional>
17 #include <new>
18 #include <cstdlib>
19 #include <cassert>
20 
21 int new_called = 0;
22 
23 void* operator new(std::size_t s) throw(std::bad_alloc)
24 {
25     ++new_called;
26     return std::malloc(s);
27 }
28 
29 void  operator delete(void* p) throw()
30 {
31     --new_called;
32     std::free(p);
33 }
34 
35 class A
36 {
37     int data_[10];
38 public:
39     static int count;
40 
41     A()
42     {
43         ++count;
44         for (int i = 0; i < 10; ++i)
45             data_[i] = i;
46     }
47 
48     A(const A&) {++count;}
49 
50     ~A() {--count;}
51 
52     int operator()(int i) const
53     {
54         for (int j = 0; j < 10; ++j)
55             i += data_[j];
56         return i;
57     }
58 };
59 
60 int A::count = 0;
61 
62 int g(int) {return 0;}
63 
64 int main()
65 {
66     assert(new_called == 0);
67     {
68     std::function<int(int)> f = A();
69     assert(A::count == 1);
70     assert(new_called == 1);
71     assert(f.target<A>());
72     f = nullptr;
73     assert(A::count == 0);
74     assert(new_called == 0);
75     assert(f.target<A>() == 0);
76     }
77     {
78     std::function<int(int)> f = g;
79     assert(new_called == 0);
80     assert(f.target<int(*)(int)>());
81     assert(f.target<A>() == 0);
82     f = nullptr;
83     assert(new_called == 0);
84     assert(f.target<int(*)(int)>() == 0);
85     }
86 }
87