111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//===----------------------------------------------------------------------===// 211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// 311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// The LLVM Compiler Infrastructure 411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// 511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// This file is dual licensed under the MIT and the University of Illinois Open 611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Source Licenses. See LICENSE.TXT for details. 711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// 811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//===----------------------------------------------------------------------===// 911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 1011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// <functional> 1111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 1211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// class function<R(ArgTypes...)> 1311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 1411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// template<class A> function(allocator_arg_t, const A&, function&&); 1511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 1611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <functional> 1711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <cassert> 1811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 1911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include "test_allocator.h" 2011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 2111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertint new_called = 0; 2211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 2311cd02dfb91661c65134cac258cf5924270e9d2Dan Albertvoid* operator new(std::size_t s) throw(std::bad_alloc) 2411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ 2511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ++new_called; 2611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return std::malloc(s); 2711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} 2811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 2911cd02dfb91661c65134cac258cf5924270e9d2Dan Albertvoid operator delete(void* p) throw() 3011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ 3111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert --new_called; 3211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert std::free(p); 3311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} 3411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 3511cd02dfb91661c65134cac258cf5924270e9d2Dan Albertclass A 3611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ 3711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert int data_[10]; 3811cd02dfb91661c65134cac258cf5924270e9d2Dan Albertpublic: 3911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert static int count; 4011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 4111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert A() 4211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 4311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ++count; 4411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert for (int i = 0; i < 10; ++i) 4511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert data_[i] = i; 4611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 4711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 4811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert A(const A&) {++count;} 4911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 5011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ~A() {--count;} 5111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 5211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert int operator()(int i) const 5311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 5411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert for (int j = 0; j < 10; ++j) 5511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert i += data_[j]; 5611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return i; 5711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 5811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}; 5911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 6011cd02dfb91661c65134cac258cf5924270e9d2Dan Albertint A::count = 0; 6111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 6211cd02dfb91661c65134cac258cf5924270e9d2Dan Albertint main() 6311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ 6411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 6511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(new_called == 0); 6611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 6711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert std::function<int(int)> f = A(); 6811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(A::count == 1); 6911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(new_called == 1); 7011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(f.target<A>()); 7111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(f.target<int(*)(int)>() == 0); 7211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert std::function<int(int)> f2(std::allocator_arg, test_allocator<A>(), std::move(f)); 7311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(A::count == 1); 7411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(new_called == 1); 7511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(f2.target<A>()); 7611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(f2.target<int(*)(int)>() == 0); 7711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(f.target<A>() == 0); 7811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(f.target<int(*)(int)>() == 0); 7911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 8011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 8111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} 82