copy.pass.cpp revision 73d21a4f0774d3fadab98e690619a359cfb160a3
12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//===----------------------------------------------------------------------===// 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// The LLVM Compiler Infrastructure 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// This file is distributed under the University of Illinois Open Source 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// License. See LICENSE.TXT for details. 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//===----------------------------------------------------------------------===// 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// <functional> 11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// class function<R(ArgTypes...)> 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// function(const function& f); 15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <functional> 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <new> 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <cstdlib> 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <cassert> 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int new_called = 0; 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void* operator new(std::size_t s) throw(std::bad_alloc) 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){ 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++new_called; 26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return std::malloc(s); 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void operator delete(void* p) throw() 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){ 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) --new_called; 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::free(p); 33a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 3490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 3590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class A 3690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles){ 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int data_[10]; 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public: 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static int count; 4090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 41a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) A() 4290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) { 4390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ++count; 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (int i = 0; i < 10; ++i) 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) data_[i] = i; 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) A(const A&) {++count;} 49a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 50a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ~A() {--count;} 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) int operator()(int i) const 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (int j = 0; j < 10; ++j) 5558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) i += data_[j]; 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return i; 57a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 58a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}; 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int A::count = 0; 6158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int g(int) {return 0;} 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int main() 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){ 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assert(new_called == 0); 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::function<int(int)> f = A(); 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assert(A::count == 1); 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assert(new_called == 1); 7190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) assert(f.target<A>()); 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assert(f.target<int(*)(int)>() == 0); 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::function<int(int)> f2 = f; 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assert(A::count == 2); 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assert(new_called == 2); 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assert(f2.target<A>()); 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assert(f2.target<int(*)(int)>() == 0); 7890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assert(A::count == 0); 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assert(new_called == 0); 81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) { 82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::function<int(int)> f = g; 8390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) assert(new_called == 0); 84a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) assert(f.target<int(*)(int)>()); 85a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) assert(f.target<A>() == 0); 86d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) std::function<int(int)> f2 = f; 87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) assert(new_called == 0); 88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) assert(f2.target<int(*)(int)>()); 89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) assert(f2.target<A>() == 0); 90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 91d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) assert(new_called == 0); 92d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) { 93d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) std::function<int(int)> f; 94d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) assert(new_called == 0); 95d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) assert(f.target<int(*)(int)>() == 0); 9690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) assert(f.target<A>() == 0); 9790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) std::function<int(int)> f2 = f; 9890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) assert(new_called == 0); 99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) assert(f2.target<int(*)(int)>() == 0); 100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) assert(f2.target<A>() == 0); 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assert(new_called == 0); 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::function<int(int)> f = A(); 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assert(A::count == 1); 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assert(new_called == 1); 10890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) assert(f.target<A>()); 10990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) assert(f.target<int(*)(int)>() == 0); 11090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) std::function<int(int)> f2 = _STD::move(f); 11190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) assert(A::count == 1); 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assert(new_called == 1); 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assert(f2.target<A>()); 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assert(f2.target<int(*)(int)>() == 0); 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assert(f.target<A>() == 0); 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assert(f.target<int(*)(int)>() == 0); 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)