copy_assign.pass.cpp revision f5256e16dfc425c1d466f6308d4026d529ce9e0b
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===//
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//                     The LLVM Compiler Infrastructure
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This file is distributed under the University of Illinois Open Source
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// License. See LICENSE.TXT for details.
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===//
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// <functional>
11a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
12a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// class function<R(ArgTypes...)>
13a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// function& operator=(const function& f);
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <functional>
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <new>
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <cstdlib>
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <cassert>
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int new_called = 0;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void* operator new(std::size_t s) throw(std::bad_alloc)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ++new_called;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return std::malloc(s);
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void  operator delete(void* p) throw()
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    --new_called;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::free(p);
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class A
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int data_[10];
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)public:
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    static int count;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    A()
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ++count;
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        for (int i = 0; i < 10; ++i)
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            data_[i] = i;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
48a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    A(const A&) {++count;}
49a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ~A() {--count;}
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int operator()(int i) const
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        for (int j = 0; j < 10; ++j)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            i += data_[j];
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return i;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int A::count = 0;
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int g(int) {return 0;}
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int main()
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert(new_called == 0);
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::function<int(int)> f = A();
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert(A::count == 1);
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert(new_called == 1);
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert(f.target<A>());
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert(f.target<int(*)(int)>() == 0);
735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    std::function<int(int)> f2;
745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    f2 = f;
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert(A::count == 2);
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert(new_called == 2);
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert(f2.target<A>());
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert(f2.target<int(*)(int)>() == 0);
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert(A::count == 0);
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert(new_called == 0);
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    std::function<int(int)> f = g;
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    assert(new_called == 0);
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    assert(f.target<int(*)(int)>());
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert(f.target<A>() == 0);
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::function<int(int)> f2;
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    f2 = f;
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert(new_called == 0);
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert(f2.target<int(*)(int)>());
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert(f2.target<A>() == 0);
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert(new_called == 0);
94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    {
9568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    std::function<int(int)> f;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert(new_called == 0);
97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    assert(f.target<int(*)(int)>() == 0);
98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    assert(f.target<A>() == 0);
99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    std::function<int(int)> f2;
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    f2 = f;
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert(new_called == 0);
102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    assert(f2.target<int(*)(int)>() == 0);
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert(f2.target<A>() == 0);
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef _LIBCPP_MOVE
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert(new_called == 0);
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    std::function<int(int)> f = A();
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    assert(A::count == 1);
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    assert(new_called == 1);
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    assert(f.target<A>());
112f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    assert(f.target<int(*)(int)>() == 0);
113f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    std::function<int(int)> f2;
114f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    f2 = _STD::move(f);
1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    assert(A::count == 1);
1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    assert(new_called == 1);
1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    assert(f2.target<A>());
1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    assert(f2.target<int(*)(int)>() == 0);
1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    assert(f.target<A>() == 0);
1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    assert(f.target<int(*)(int)>() == 0);
12146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    }
12246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#endif
12346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
12446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)