//===----------------------------------------------------------------------===//
//
// 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(nullptr_t);
#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;}intfoo(int)const{return1;}};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);}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);}assert(new_called==0);{std::function<int(int)>f=(int(*)(int))0;assert(!f);assert(new_called==0);assert(f.target<int(*)(int)>()==0);assert(f.target<A>()==0);}{std::function<int(constA*,int)>f=&A::foo;assert(f);assert(new_called==0);assert(f.target<int(A::*)(int)const>()!=0);}}