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=(const function& f);
15
16#include <functional>
17#include <cassert>
18
19#include "test_macros.h"
20#include "count_new.hpp"
21
22class A {
23  int data_[10];
24
25public:
26  static int count;
27
28  A() {
29    ++count;
30    for (int i = 0; i < 10; ++i)
31      data_[i] = i;
32  }
33
34  A(const A &) { ++count; }
35
36  ~A() { --count; }
37
38  int operator()(int i) const {
39    for (int j = 0; j < 10; ++j)
40      i += data_[j];
41    return i;
42  }
43};
44
45int A::count = 0;
46
47int g0() { return 0; }
48int g(int) { return 0; }
49int g2(int, int) { return 2; }
50int g3(int, int, int) { return 3; }
51
52int main() {
53  assert(globalMemCounter.checkOutstandingNewEq(0));
54  {
55    std::function<int(int)> f = A();
56    assert(A::count == 1);
57    assert(globalMemCounter.checkOutstandingNewEq(1));
58    assert(f.target<A>());
59    assert(f.target<int (*)(int)>() == 0);
60    std::function<int(int)> f2;
61    f2 = f;
62    assert(A::count == 2);
63    assert(globalMemCounter.checkOutstandingNewEq(2));
64    assert(f2.target<A>());
65    assert(f2.target<int (*)(int)>() == 0);
66  }
67  assert(A::count == 0);
68  assert(globalMemCounter.checkOutstandingNewEq(0));
69  {
70    std::function<int(int)> f = g;
71    assert(globalMemCounter.checkOutstandingNewEq(0));
72    assert(f.target<int (*)(int)>());
73    assert(f.target<A>() == 0);
74    std::function<int(int)> f2;
75    f2 = f;
76    assert(globalMemCounter.checkOutstandingNewEq(0));
77    assert(f2.target<int (*)(int)>());
78    assert(f2.target<A>() == 0);
79  }
80  assert(globalMemCounter.checkOutstandingNewEq(0));
81  {
82    std::function<int(int)> f;
83    assert(globalMemCounter.checkOutstandingNewEq(0));
84    assert(f.target<int (*)(int)>() == 0);
85    assert(f.target<A>() == 0);
86    std::function<int(int)> f2;
87    f2 = f;
88    assert(globalMemCounter.checkOutstandingNewEq(0));
89    assert(f2.target<int (*)(int)>() == 0);
90    assert(f2.target<A>() == 0);
91  }
92  {
93    typedef std::function<int()> Func;
94    Func f = g0;
95    Func& fr = (f = f);
96    assert(&fr == &f);
97    assert(*f.target<int(*)()>() == g0);
98  }
99  {
100    typedef std::function<int(int)> Func;
101    Func f = g;
102    Func& fr = (f = f);
103    assert(&fr == &f);
104    assert(*f.target<int(*)(int)>() == g);
105  }
106  {
107    typedef std::function<int(int, int)> Func;
108    Func f = g2;
109    Func& fr = (f = f);
110    assert(&fr == &f);
111    assert(*f.target<int(*)(int, int)>() == g2);
112  }
113  {
114    typedef std::function<int(int, int, int)> Func;
115    Func f = g3;
116    Func& fr = (f = f);
117    assert(&fr == &f);
118    assert(*f.target<int(*)(int, int, int)>() == g3);
119  }
120#if TEST_STD_VER >= 11
121  assert(globalMemCounter.checkOutstandingNewEq(0));
122  {
123    std::function<int(int)> f = A();
124    assert(A::count == 1);
125    assert(globalMemCounter.checkOutstandingNewEq(1));
126    assert(f.target<A>());
127    assert(f.target<int (*)(int)>() == 0);
128    std::function<int(int)> f2;
129    f2 = std::move(f);
130    assert(A::count == 1);
131    assert(globalMemCounter.checkOutstandingNewEq(1));
132    assert(f2.target<A>());
133    assert(f2.target<int (*)(int)>() == 0);
134    assert(f.target<A>() == 0);
135    assert(f.target<int (*)(int)>() == 0);
136  }
137#endif
138}
139