144 lines · cpp
1//===----------------------------------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9// UNSUPPORTED: c++0310 11// <functional>12 13// class function<R(ArgTypes...)>14 15// function& operator=(const function& f);16 17#include <cassert>18#include <functional>19#include <utility>20 21#include "test_macros.h"22#include "count_new.h"23 24class A {25 int data_[10];26 27public:28 static int count;29 30 A() {31 ++count;32 for (int i = 0; i < 10; ++i)33 data_[i] = i;34 }35 36 A(const A &) { ++count; }37 38 ~A() { --count; }39 40 int operator()(int i) const {41 for (int j = 0; j < 10; ++j)42 i += data_[j];43 return i;44 }45};46 47int A::count = 0;48 49int g0() { return 0; }50int g(int) { return 0; }51int g2(int, int) { return 2; }52int g3(int, int, int) { return 3; }53 54int main(int, char**) {55 globalMemCounter.reset();56 assert(globalMemCounter.checkOutstandingNewEq(0));57 {58 std::function<int(int)> f = A();59 assert(A::count == 1);60 assert(globalMemCounter.checkOutstandingNewLessThanOrEqual(1));61 RTTI_ASSERT(f.target<A>());62 RTTI_ASSERT(f.target<int (*)(int)>() == 0);63 std::function<int(int)> f2;64 f2 = f;65 assert(A::count == 2);66 assert(globalMemCounter.checkOutstandingNewLessThanOrEqual(2));67 RTTI_ASSERT(f2.target<A>());68 RTTI_ASSERT(f2.target<int (*)(int)>() == 0);69 }70 assert(A::count == 0);71 assert(globalMemCounter.checkOutstandingNewEq(0));72 {73 std::function<int(int)> f = g;74 assert(globalMemCounter.checkOutstandingNewEq(0));75 RTTI_ASSERT(f.target<int (*)(int)>());76 RTTI_ASSERT(f.target<A>() == 0);77 std::function<int(int)> f2;78 f2 = f;79 assert(globalMemCounter.checkOutstandingNewEq(0));80 RTTI_ASSERT(f2.target<int (*)(int)>());81 RTTI_ASSERT(f2.target<A>() == 0);82 }83 assert(globalMemCounter.checkOutstandingNewEq(0));84 {85 std::function<int(int)> f;86 assert(globalMemCounter.checkOutstandingNewEq(0));87 RTTI_ASSERT(f.target<int (*)(int)>() == 0);88 RTTI_ASSERT(f.target<A>() == 0);89 std::function<int(int)> f2;90 f2 = f;91 assert(globalMemCounter.checkOutstandingNewEq(0));92 RTTI_ASSERT(f2.target<int (*)(int)>() == 0);93 RTTI_ASSERT(f2.target<A>() == 0);94 }95 {96 typedef std::function<int()> Func;97 Func f = g0;98 Func& fr = (f = (Func &)f);99 assert(&fr == &f);100 RTTI_ASSERT(*f.target<int(*)()>() == g0);101 }102 {103 typedef std::function<int(int)> Func;104 Func f = g;105 Func& fr = (f = (Func &)f);106 assert(&fr == &f);107 RTTI_ASSERT(*f.target<int(*)(int)>() == g);108 }109 {110 typedef std::function<int(int, int)> Func;111 Func f = g2;112 Func& fr = (f = (Func &)f);113 assert(&fr == &f);114 RTTI_ASSERT(*f.target<int(*)(int, int)>() == g2);115 }116 {117 typedef std::function<int(int, int, int)> Func;118 Func f = g3;119 Func& fr = (f = (Func &)f);120 assert(&fr == &f);121 RTTI_ASSERT(*f.target<int(*)(int, int, int)>() == g3);122 }123#if TEST_STD_VER >= 11124 assert(globalMemCounter.checkOutstandingNewEq(0));125 {126 std::function<int(int)> f = A();127 assert(A::count == 1);128 assert(globalMemCounter.checkOutstandingNewLessThanOrEqual(1));129 RTTI_ASSERT(f.target<A>());130 RTTI_ASSERT(f.target<int (*)(int)>() == 0);131 std::function<int(int)> f2;132 f2 = std::move(f);133 assert(A::count == 1);134 assert(globalMemCounter.checkOutstandingNewLessThanOrEqual(1));135 RTTI_ASSERT(f2.target<A>());136 RTTI_ASSERT(f2.target<int (*)(int)>() == 0);137 RTTI_ASSERT(f.target<A>() == 0);138 RTTI_ASSERT(f.target<int (*)(int)>() == 0);139 }140#endif141 142 return 0;143}144