copy_assign.pass.cpp revision 89e826a160dce10dd353e1e0bca21c6fabe86b92
1c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant//===----------------------------------------------------------------------===//
2c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant//
3c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant//                     The LLVM Compiler Infrastructure
4c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant//
5b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant// This file is dual licensed under the MIT and the University of Illinois Open
6b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant// Source Licenses. See LICENSE.TXT for details.
7c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant//
8c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant//===----------------------------------------------------------------------===//
9c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant
10c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant// <functional>
11c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant
12c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant// class function<R(ArgTypes...)>
13c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant
14c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant// function& operator=(const function& f);
15c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant
16c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant#include <functional>
17c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant#include <cassert>
18c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant
1989e826a160dce10dd353e1e0bca21c6fabe86b92Eric Fiselier#include "test_macros.h"
204eb5b6d5ee23721a64e2b6d1bb5e133321ae5c9eEric Fiselier#include "count_new.hpp"
21c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant
22c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnantclass A
23c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant{
24c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    int data_[10];
25c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnantpublic:
26c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    static int count;
27c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant
28c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    A()
29c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    {
30c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant        ++count;
31c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant        for (int i = 0; i < 10; ++i)
32c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant            data_[i] = i;
33c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    }
34c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant
35c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    A(const A&) {++count;}
36c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant
37c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    ~A() {--count;}
38c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant
39c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    int operator()(int i) const
40c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    {
41c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant        for (int j = 0; j < 10; ++j)
42c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant            i += data_[j];
43c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant        return i;
44c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    }
45c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant};
46c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant
47c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnantint A::count = 0;
48c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant
49c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnantint g(int) {return 0;}
50c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant
51c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnantint main()
52c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant{
534eb5b6d5ee23721a64e2b6d1bb5e133321ae5c9eEric Fiselier    assert(globalMemCounter.checkOutstandingNewEq(0));
54c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    {
55c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    std::function<int(int)> f = A();
56c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    assert(A::count == 1);
574eb5b6d5ee23721a64e2b6d1bb5e133321ae5c9eEric Fiselier    assert(globalMemCounter.checkOutstandingNewEq(1));
58c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    assert(f.target<A>());
59c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    assert(f.target<int(*)(int)>() == 0);
60c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    std::function<int(int)> f2;
61c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    f2 = f;
62c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    assert(A::count == 2);
634eb5b6d5ee23721a64e2b6d1bb5e133321ae5c9eEric Fiselier    assert(globalMemCounter.checkOutstandingNewEq(2));
64c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    assert(f2.target<A>());
65c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    assert(f2.target<int(*)(int)>() == 0);
66c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    }
67c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    assert(A::count == 0);
684eb5b6d5ee23721a64e2b6d1bb5e133321ae5c9eEric Fiselier    assert(globalMemCounter.checkOutstandingNewEq(0));
69c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    {
70c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    std::function<int(int)> f = g;
714eb5b6d5ee23721a64e2b6d1bb5e133321ae5c9eEric Fiselier    assert(globalMemCounter.checkOutstandingNewEq(0));
72c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    assert(f.target<int(*)(int)>());
73c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    assert(f.target<A>() == 0);
74c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    std::function<int(int)> f2;
75c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    f2 = f;
764eb5b6d5ee23721a64e2b6d1bb5e133321ae5c9eEric Fiselier    assert(globalMemCounter.checkOutstandingNewEq(0));
77c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    assert(f2.target<int(*)(int)>());
78c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    assert(f2.target<A>() == 0);
79c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    }
804eb5b6d5ee23721a64e2b6d1bb5e133321ae5c9eEric Fiselier    assert(globalMemCounter.checkOutstandingNewEq(0));
81c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    {
82c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    std::function<int(int)> f;
834eb5b6d5ee23721a64e2b6d1bb5e133321ae5c9eEric Fiselier    assert(globalMemCounter.checkOutstandingNewEq(0));
84c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    assert(f.target<int(*)(int)>() == 0);
85c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    assert(f.target<A>() == 0);
86c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    std::function<int(int)> f2;
87c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    f2 = f;
884eb5b6d5ee23721a64e2b6d1bb5e133321ae5c9eEric Fiselier    assert(globalMemCounter.checkOutstandingNewEq(0));
89c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    assert(f2.target<int(*)(int)>() == 0);
90c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    assert(f2.target<A>() == 0);
91c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    }
9289e826a160dce10dd353e1e0bca21c6fabe86b92Eric Fiselier#if TEST_STD_VER >= 11
934eb5b6d5ee23721a64e2b6d1bb5e133321ae5c9eEric Fiselier    assert(globalMemCounter.checkOutstandingNewEq(0));
94c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    {
95c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    std::function<int(int)> f = A();
96c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    assert(A::count == 1);
974eb5b6d5ee23721a64e2b6d1bb5e133321ae5c9eEric Fiselier    assert(globalMemCounter.checkOutstandingNewEq(1));
98c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    assert(f.target<A>());
99c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    assert(f.target<int(*)(int)>() == 0);
100c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    std::function<int(int)> f2;
10161aa6013c3377203aff484cf3300ac26511c26acHoward Hinnant    f2 = std::move(f);
102c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    assert(A::count == 1);
1034eb5b6d5ee23721a64e2b6d1bb5e133321ae5c9eEric Fiselier    assert(globalMemCounter.checkOutstandingNewEq(1));
104c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    assert(f2.target<A>());
105c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    assert(f2.target<int(*)(int)>() == 0);
106c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    assert(f.target<A>() == 0);
107c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    assert(f.target<int(*)(int)>() == 0);
108c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    }
10989e826a160dce10dd353e1e0bca21c6fabe86b92Eric Fiselier#endif
110c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant}
111