1//===----------------------------------------------------------------------===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is dual licensed under the MIT and the University of Illinois Open
6// Source Licenses. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// UNSUPPORTED: libcpp-has-no-threads, c++98, c++03
11
12// <future>
13
14// class future<R>
15
16// future& operator=(future&& rhs);
17
18#include <future>
19#include <cassert>
20
21int main()
22{
23    {
24        typedef int T;
25        std::promise<T> p;
26        std::future<T> f0 = p.get_future();
27        std::future<T> f;
28        f = std::move(f0);
29        assert(!f0.valid());
30        assert(f.valid());
31    }
32    {
33        typedef int T;
34        std::future<T> f0;
35        std::future<T> f;
36        f = std::move(f0);
37        assert(!f0.valid());
38        assert(!f.valid());
39    }
40    {
41        typedef int& T;
42        std::promise<T> p;
43        std::future<T> f0 = p.get_future();
44        std::future<T> f;
45        f = std::move(f0);
46        assert(!f0.valid());
47        assert(f.valid());
48    }
49    {
50        typedef int& T;
51        std::future<T> f0;
52        std::future<T> f;
53        f = std::move(f0);
54        assert(!f0.valid());
55        assert(!f.valid());
56    }
57    {
58        typedef void T;
59        std::promise<T> p;
60        std::future<T> f0 = p.get_future();
61        std::future<T> f;
62        f = std::move(f0);
63        assert(!f0.valid());
64        assert(f.valid());
65    }
66    {
67        typedef void T;
68        std::future<T> f0;
69        std::future<T> f;
70        f = std::move(f0);
71        assert(!f0.valid());
72        assert(!f.valid());
73    }
74}
75