15a83710eSEric Fiselier //===----------------------------------------------------------------------===//
25a83710eSEric Fiselier //
357b08b09SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
457b08b09SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
557b08b09SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
65a83710eSEric Fiselier //
75a83710eSEric Fiselier //===----------------------------------------------------------------------===//
85a83710eSEric Fiselier
95a83710eSEric Fiselier // <functional>
105a83710eSEric Fiselier
115a83710eSEric Fiselier // class function<R(ArgTypes...)>
125a83710eSEric Fiselier
135a83710eSEric Fiselier // void swap(function& other);
145a83710eSEric Fiselier
15b4fb705eSLouis Dionne // This test runs in C++03, but we have deprecated using std::function in C++03.
16*c475e31aSNikolas Klauser // ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX03_FUNCTION
17b4fb705eSLouis Dionne
185a83710eSEric Fiselier #include <functional>
195a83710eSEric Fiselier #include <cassert>
205a83710eSEric Fiselier
21cc89063bSNico Weber #include "count_new.h"
225a83710eSEric Fiselier
237fc6a556SMarshall Clow #include "test_macros.h"
247fc6a556SMarshall Clow
25d566c345SEric Fiselier class A {
265a83710eSEric Fiselier int data_[10];
27d566c345SEric Fiselier
285a83710eSEric Fiselier public:
295a83710eSEric Fiselier static int count;
305a83710eSEric Fiselier
A(int j)31d566c345SEric Fiselier explicit A(int j) {
325a83710eSEric Fiselier ++count;
335a83710eSEric Fiselier data_[0] = j;
345a83710eSEric Fiselier }
355a83710eSEric Fiselier
A(const A & a)36d566c345SEric Fiselier A(const A &a) {
375a83710eSEric Fiselier ++count;
385a83710eSEric Fiselier for (int i = 0; i < 10; ++i)
395a83710eSEric Fiselier data_[i] = a.data_[i];
405a83710eSEric Fiselier }
415a83710eSEric Fiselier
~A()425a83710eSEric Fiselier ~A() { --count; }
435a83710eSEric Fiselier
operator ()(int i) const44d566c345SEric Fiselier int operator()(int i) const {
455a83710eSEric Fiselier for (int j = 0; j < 10; ++j)
465a83710eSEric Fiselier i += data_[j];
475a83710eSEric Fiselier return i;
485a83710eSEric Fiselier }
495a83710eSEric Fiselier
operator ()() const50d566c345SEric Fiselier int operator()() const { return -1; }
operator ()(int,int) const51d566c345SEric Fiselier int operator()(int, int) const { return -2; }
operator ()(int,int,int) const52d566c345SEric Fiselier int operator()(int, int, int) const { return -3; }
53d566c345SEric Fiselier
id() const545a83710eSEric Fiselier int id() const { return data_[0]; }
555a83710eSEric Fiselier };
565a83710eSEric Fiselier
575a83710eSEric Fiselier int A::count = 0;
585a83710eSEric Fiselier
g0()59d566c345SEric Fiselier int g0() { return 0; }
g(int)605a83710eSEric Fiselier int g(int) { return 0; }
h(int)615a83710eSEric Fiselier int h(int) { return 1; }
g2(int,int)62d566c345SEric Fiselier int g2(int, int) { return 2; }
g3(int,int,int)63d566c345SEric Fiselier int g3(int, int, int) { return 3; }
645a83710eSEric Fiselier
main(int,char **)652df59c50SJF Bastien int main(int, char**) {
669c5d0ea6SDan Albert globalMemCounter.reset();
672cbc654dSEric Fiselier assert(globalMemCounter.checkOutstandingNewEq(0));
685a83710eSEric Fiselier {
695a83710eSEric Fiselier std::function<int(int)> f1 = A(1);
705a83710eSEric Fiselier std::function<int(int)> f2 = A(2);
715a83710eSEric Fiselier assert(A::count == 2);
722cbc654dSEric Fiselier assert(globalMemCounter.checkOutstandingNewEq(2));
73bb09ef95SLouis Dionne RTTI_ASSERT(f1.target<A>()->id() == 1);
74bb09ef95SLouis Dionne RTTI_ASSERT(f2.target<A>()->id() == 2);
755a83710eSEric Fiselier f1.swap(f2);
765a83710eSEric Fiselier assert(A::count == 2);
772cbc654dSEric Fiselier assert(globalMemCounter.checkOutstandingNewEq(2));
78bb09ef95SLouis Dionne RTTI_ASSERT(f1.target<A>()->id() == 2);
79bb09ef95SLouis Dionne RTTI_ASSERT(f2.target<A>()->id() == 1);
805a83710eSEric Fiselier }
815a83710eSEric Fiselier assert(A::count == 0);
822cbc654dSEric Fiselier assert(globalMemCounter.checkOutstandingNewEq(0));
835a83710eSEric Fiselier {
845a83710eSEric Fiselier std::function<int(int)> f1 = A(1);
855a83710eSEric Fiselier std::function<int(int)> f2 = g;
865a83710eSEric Fiselier assert(A::count == 1);
872cbc654dSEric Fiselier assert(globalMemCounter.checkOutstandingNewEq(1));
88bb09ef95SLouis Dionne RTTI_ASSERT(f1.target<A>()->id() == 1);
89bb09ef95SLouis Dionne RTTI_ASSERT(*f2.target<int (*)(int)>() == g);
905a83710eSEric Fiselier f1.swap(f2);
915a83710eSEric Fiselier assert(A::count == 1);
922cbc654dSEric Fiselier assert(globalMemCounter.checkOutstandingNewEq(1));
93bb09ef95SLouis Dionne RTTI_ASSERT(*f1.target<int (*)(int)>() == g);
94bb09ef95SLouis Dionne RTTI_ASSERT(f2.target<A>()->id() == 1);
955a83710eSEric Fiselier }
965a83710eSEric Fiselier assert(A::count == 0);
972cbc654dSEric Fiselier assert(globalMemCounter.checkOutstandingNewEq(0));
985a83710eSEric Fiselier {
995a83710eSEric Fiselier std::function<int(int)> f1 = g;
1005a83710eSEric Fiselier std::function<int(int)> f2 = A(1);
1015a83710eSEric Fiselier assert(A::count == 1);
1022cbc654dSEric Fiselier assert(globalMemCounter.checkOutstandingNewEq(1));
103bb09ef95SLouis Dionne RTTI_ASSERT(*f1.target<int (*)(int)>() == g);
104bb09ef95SLouis Dionne RTTI_ASSERT(f2.target<A>()->id() == 1);
1055a83710eSEric Fiselier f1.swap(f2);
1065a83710eSEric Fiselier assert(A::count == 1);
1072cbc654dSEric Fiselier assert(globalMemCounter.checkOutstandingNewEq(1));
108bb09ef95SLouis Dionne RTTI_ASSERT(f1.target<A>()->id() == 1);
109bb09ef95SLouis Dionne RTTI_ASSERT(*f2.target<int (*)(int)>() == g);
1105a83710eSEric Fiselier }
1115a83710eSEric Fiselier assert(A::count == 0);
1122cbc654dSEric Fiselier assert(globalMemCounter.checkOutstandingNewEq(0));
1135a83710eSEric Fiselier {
1145a83710eSEric Fiselier std::function<int(int)> f1 = g;
1155a83710eSEric Fiselier std::function<int(int)> f2 = h;
1165a83710eSEric Fiselier assert(A::count == 0);
1172cbc654dSEric Fiselier assert(globalMemCounter.checkOutstandingNewEq(0));
118bb09ef95SLouis Dionne RTTI_ASSERT(*f1.target<int (*)(int)>() == g);
119bb09ef95SLouis Dionne RTTI_ASSERT(*f2.target<int (*)(int)>() == h);
1205a83710eSEric Fiselier f1.swap(f2);
1215a83710eSEric Fiselier assert(A::count == 0);
1222cbc654dSEric Fiselier assert(globalMemCounter.checkOutstandingNewEq(0));
123bb09ef95SLouis Dionne RTTI_ASSERT(*f1.target<int (*)(int)>() == h);
124bb09ef95SLouis Dionne RTTI_ASSERT(*f2.target<int (*)(int)>() == g);
1255a83710eSEric Fiselier }
1265a83710eSEric Fiselier assert(A::count == 0);
1272cbc654dSEric Fiselier assert(globalMemCounter.checkOutstandingNewEq(0));
128d566c345SEric Fiselier {
129d566c345SEric Fiselier std::function<int(int)> f1 = A(1);
130d566c345SEric Fiselier assert(A::count == 1);
131d566c345SEric Fiselier {
132d566c345SEric Fiselier DisableAllocationGuard guard;
133d566c345SEric Fiselier ((void)guard);
134d566c345SEric Fiselier f1.swap(f1);
135d566c345SEric Fiselier }
136d566c345SEric Fiselier assert(A::count == 1);
137bb09ef95SLouis Dionne RTTI_ASSERT(f1.target<A>()->id() == 1);
138d566c345SEric Fiselier }
139d566c345SEric Fiselier assert(A::count == 0);
140d566c345SEric Fiselier assert(globalMemCounter.checkOutstandingNewEq(0));
141d566c345SEric Fiselier {
142d566c345SEric Fiselier std::function<int()> f1 = g0;
143d566c345SEric Fiselier DisableAllocationGuard guard;
144d566c345SEric Fiselier ((void)guard);
145d566c345SEric Fiselier f1.swap(f1);
146bb09ef95SLouis Dionne RTTI_ASSERT(*f1.target<int (*)()>() == g0);
147d566c345SEric Fiselier }
148d566c345SEric Fiselier assert(globalMemCounter.checkOutstandingNewEq(0));
149d566c345SEric Fiselier {
150d566c345SEric Fiselier std::function<int(int, int)> f1 = g2;
151d566c345SEric Fiselier DisableAllocationGuard guard;
152d566c345SEric Fiselier ((void)guard);
153d566c345SEric Fiselier f1.swap(f1);
154bb09ef95SLouis Dionne RTTI_ASSERT(*f1.target<int (*)(int, int)>() == g2);
155d566c345SEric Fiselier }
156d566c345SEric Fiselier assert(globalMemCounter.checkOutstandingNewEq(0));
157d566c345SEric Fiselier {
158d566c345SEric Fiselier std::function<int(int, int, int)> f1 = g3;
159d566c345SEric Fiselier DisableAllocationGuard guard;
160d566c345SEric Fiselier ((void)guard);
161d566c345SEric Fiselier f1.swap(f1);
162bb09ef95SLouis Dionne RTTI_ASSERT(*f1.target<int (*)(int, int, int)>() == g3);
163d566c345SEric Fiselier }
164d566c345SEric Fiselier assert(globalMemCounter.checkOutstandingNewEq(0));
165d566c345SEric Fiselier {
166d566c345SEric Fiselier std::function<int()> f1 = A(1);
167d566c345SEric Fiselier assert(A::count == 1);
168d566c345SEric Fiselier DisableAllocationGuard guard;
169d566c345SEric Fiselier ((void)guard);
170d566c345SEric Fiselier f1.swap(f1);
171d566c345SEric Fiselier assert(A::count == 1);
172bb09ef95SLouis Dionne RTTI_ASSERT(f1.target<A>()->id() == 1);
173d566c345SEric Fiselier }
174d566c345SEric Fiselier assert(globalMemCounter.checkOutstandingNewEq(0));
175d566c345SEric Fiselier assert(A::count == 0);
176d566c345SEric Fiselier {
177d566c345SEric Fiselier std::function<int(int, int)> f1 = A(2);
178d566c345SEric Fiselier assert(A::count == 1);
179d566c345SEric Fiselier DisableAllocationGuard guard;
180d566c345SEric Fiselier ((void)guard);
181d566c345SEric Fiselier f1.swap(f1);
182d566c345SEric Fiselier assert(A::count == 1);
183bb09ef95SLouis Dionne RTTI_ASSERT(f1.target<A>()->id() == 2);
184d566c345SEric Fiselier }
185d566c345SEric Fiselier assert(globalMemCounter.checkOutstandingNewEq(0));
186d566c345SEric Fiselier assert(A::count == 0);
187d566c345SEric Fiselier {
188d566c345SEric Fiselier std::function<int(int, int, int)> f1 = A(3);
189d566c345SEric Fiselier assert(A::count == 1);
190d566c345SEric Fiselier DisableAllocationGuard guard;
191d566c345SEric Fiselier ((void)guard);
192d566c345SEric Fiselier f1.swap(f1);
193d566c345SEric Fiselier assert(A::count == 1);
194bb09ef95SLouis Dionne RTTI_ASSERT(f1.target<A>()->id() == 3);
195d566c345SEric Fiselier }
196d566c345SEric Fiselier assert(globalMemCounter.checkOutstandingNewEq(0));
197d566c345SEric Fiselier assert(A::count == 0);
1982df59c50SJF Bastien
1992df59c50SJF Bastien return 0;
2005a83710eSEric Fiselier }
201