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)