copy_assign.pass.cpp revision f5256e16dfc425c1d466f6308d4026d529ce9e0b
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===// 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The LLVM Compiler Infrastructure 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This file is distributed under the University of Illinois Open Source 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// License. See LICENSE.TXT for details. 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===// 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// <functional> 11a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 12a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// class function<R(ArgTypes...)> 13a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// function& operator=(const function& f); 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <functional> 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <new> 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <cstdlib> 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <cassert> 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int new_called = 0; 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void* operator new(std::size_t s) throw(std::bad_alloc) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ++new_called; 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return std::malloc(s); 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void operator delete(void* p) throw() 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) --new_called; 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::free(p); 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class A 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int data_[10]; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)public: 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static int count; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) A() 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++count; 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < 10; ++i) 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) data_[i] = i; 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 48a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) A(const A&) {++count;} 49a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~A() {--count;} 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int operator()(int i) const 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int j = 0; j < 10; ++j) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i += data_[j]; 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return i; 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int A::count = 0; 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int g(int) {return 0;} 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int main() 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert(new_called == 0); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::function<int(int)> f = A(); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert(A::count == 1); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert(new_called == 1); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert(f.target<A>()); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert(f.target<int(*)(int)>() == 0); 735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu std::function<int(int)> f2; 745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu f2 = f; 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert(A::count == 2); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert(new_called == 2); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert(f2.target<A>()); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert(f2.target<int(*)(int)>() == 0); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert(A::count == 0); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert(new_called == 0); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::function<int(int)> f = g; 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assert(new_called == 0); 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assert(f.target<int(*)(int)>()); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert(f.target<A>() == 0); 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::function<int(int)> f2; 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) f2 = f; 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert(new_called == 0); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert(f2.target<int(*)(int)>()); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert(f2.target<A>() == 0); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert(new_called == 0); 94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) { 9568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) std::function<int(int)> f; 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert(new_called == 0); 97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) assert(f.target<int(*)(int)>() == 0); 98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) assert(f.target<A>() == 0); 99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::function<int(int)> f2; 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) f2 = f; 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert(new_called == 0); 102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) assert(f2.target<int(*)(int)>() == 0); 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert(f2.target<A>() == 0); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef _LIBCPP_MOVE 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert(new_called == 0); 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::function<int(int)> f = A(); 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assert(A::count == 1); 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assert(new_called == 1); 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assert(f.target<A>()); 112f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) assert(f.target<int(*)(int)>() == 0); 113f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) std::function<int(int)> f2; 114f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) f2 = _STD::move(f); 1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) assert(A::count == 1); 1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) assert(new_called == 1); 1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) assert(f2.target<A>()); 1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) assert(f2.target<int(*)(int)>() == 0); 1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) assert(f.target<A>() == 0); 1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) assert(f.target<int(*)(int)>() == 0); 12146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 12246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#endif 12346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 12446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)