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