//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// <functional>
// class function<R(ArgTypes...)>
// function(const function& f);
#include<functional>#include<new>#include<cstdlib>#include<cassert>intnew_called=0;void*operatornew(std::size_ts)throw(std::bad_alloc){++new_called;returnstd::malloc(s);}voidoperatordelete(void*p)throw(){--new_called;std::free(p);}classA{intdata_[10];public:staticintcount;A(){++count;for(inti=0;i<10;++i)data_[i]=i;}A(constA&){++count;}~A(){--count;}intoperator()(inti)const{for(intj=0;j<10;++j)i+=data_[j];returni;}};intA::count=0;intg(int){return0;}intmain(){assert(new_called==0);{std::function<int(int)>f=A();assert(A::count==1);assert(new_called==1);assert(f.target<A>());assert(f.target<int(*)(int)>()==0);std::function<int(int)>f2=f;assert(A::count==2);assert(new_called==2);assert(f2.target<A>());assert(f2.target<int(*)(int)>()==0);}assert(A::count==0);assert(new_called==0);{std::function<int(int)>f=g;assert(new_called==0);assert(f.target<int(*)(int)>());assert(f.target<A>()==0);std::function<int(int)>f2=f;assert(new_called==0);assert(f2.target<int(*)(int)>());assert(f2.target<A>()==0);}assert(new_called==0);{std::function<int(int)>f;assert(new_called==0);assert(f.target<int(*)(int)>()==0);assert(f.target<A>()==0);std::function<int(int)>f2=f;assert(new_called==0);assert(f2.target<int(*)(int)>()==0);assert(f2.target<A>()==0);}#ifdef _LIBCPP_MOVEassert(new_called==0);{std::function<int(int)>f=A();assert(A::count==1);assert(new_called==1);assert(f.target<A>());assert(f.target<int(*)(int)>()==0);std::function<int(int)>f2=_STD::move(f);assert(A::count==1);assert(new_called==1);assert(f2.target<A>());assert(f2.target<int(*)(int)>()==0);assert(f.target<A>()==0);assert(f.target<int(*)(int)>()==0);}#endif}