blob: f670fbe746b7774fdfcc09ea33de323edfeec3e0 [file] [log] [blame]
Howard Hinnantf39daa82010-08-28 21:01:06 +00001//===----------------------------------------------------------------------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10// <future>
11
12// class promise<R>
13
14// promise& operator=(promise&& rhs);
15
16#include <future>
17#include <cassert>
18
19#include "../test_allocator.h"
20
21int main()
22{
Howard Hinnant73d21a42010-09-04 23:28:19 +000023#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantf39daa82010-08-28 21:01:06 +000024 assert(test_alloc_base::count == 0);
25 {
26 std::promise<int> p0(std::allocator_arg, test_allocator<int>());
27 std::promise<int> p(std::allocator_arg, test_allocator<int>());
28 assert(test_alloc_base::count == 2);
29 p = std::move(p0);
30 assert(test_alloc_base::count == 1);
31 std::future<int> f = p.get_future();
32 assert(test_alloc_base::count == 1);
33 assert(f.valid());
34 try
35 {
36 f = p0.get_future();
37 assert(false);
38 }
39 catch (const std::future_error& e)
40 {
41 assert(e.code() == make_error_code(std::future_errc::no_state));
42 }
43 assert(test_alloc_base::count == 1);
44 }
45 assert(test_alloc_base::count == 0);
46 {
47 std::promise<int&> p0(std::allocator_arg, test_allocator<int>());
48 std::promise<int&> p(std::allocator_arg, test_allocator<int>());
49 assert(test_alloc_base::count == 2);
50 p = std::move(p0);
51 assert(test_alloc_base::count == 1);
52 std::future<int&> f = p.get_future();
53 assert(test_alloc_base::count == 1);
54 assert(f.valid());
55 try
56 {
57 f = p0.get_future();
58 assert(false);
59 }
60 catch (const std::future_error& e)
61 {
62 assert(e.code() == make_error_code(std::future_errc::no_state));
63 }
64 assert(test_alloc_base::count == 1);
65 }
66 assert(test_alloc_base::count == 0);
67 {
68 std::promise<void> p0(std::allocator_arg, test_allocator<void>());
69 std::promise<void> p(std::allocator_arg, test_allocator<void>());
70 assert(test_alloc_base::count == 2);
71 p = std::move(p0);
72 assert(test_alloc_base::count == 1);
73 std::future<void> f = p.get_future();
74 assert(test_alloc_base::count == 1);
75 assert(f.valid());
76 try
77 {
78 f = p0.get_future();
79 assert(false);
80 }
81 catch (const std::future_error& e)
82 {
83 assert(e.code() == make_error_code(std::future_errc::no_state));
84 }
85 assert(test_alloc_base::count == 1);
86 }
87 assert(test_alloc_base::count == 0);
Howard Hinnant73d21a42010-09-04 23:28:19 +000088#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantf39daa82010-08-28 21:01:06 +000089}