blob: c08278122225c6d866060be6158fad0845d769c4 [file] [log] [blame]
Howard Hinnantf39daa82010-08-28 21:01:06 +00001//===----------------------------------------------------------------------===//
2//
3// The LLVM Compiler Infrastructure
4//
Howard Hinnantb64f8b02010-11-16 22:09:02 +00005// This file is dual licensed under the MIT and the University of Illinois Open
6// Source Licenses. See LICENSE.TXT for details.
Howard Hinnantf39daa82010-08-28 21:01:06 +00007//
8//===----------------------------------------------------------------------===//
9
10// <future>
11
12// class promise<R>
13
14// promise& operator=(const promise& rhs) = delete;
15
16#include <future>
Dan Albert1d4a1ed2016-05-25 22:36:09 -070017#include <cassert>
Howard Hinnantf39daa82010-08-28 21:01:06 +000018
Dan Albert1d4a1ed2016-05-25 22:36:09 -070019#include "../test_allocator.h"
Howard Hinnantf39daa82010-08-28 21:01:06 +000020
21int main()
22{
Dan Albert1d4a1ed2016-05-25 22:36:09 -070023 assert(test_alloc_base::count == 0);
Howard Hinnantf39daa82010-08-28 21:01:06 +000024 {
Dan Albert1d4a1ed2016-05-25 22:36:09 -070025 std::promise<int> p0(std::allocator_arg, test_allocator<int>());
26 std::promise<int> p(std::allocator_arg, test_allocator<int>());
27 assert(test_alloc_base::count == 2);
28 p = p0;
29 assert(test_alloc_base::count == 1);
30 std::future<int> f = p.get_future();
31 assert(test_alloc_base::count == 1);
32 assert(f.valid());
33 try
34 {
35 f = p0.get_future();
36 assert(false);
37 }
38 catch (const std::future_error& e)
39 {
40 assert(e.code() == make_error_code(std::future_errc::no_state));
41 }
42 assert(test_alloc_base::count == 1);
Howard Hinnantf39daa82010-08-28 21:01:06 +000043 }
Dan Albert1d4a1ed2016-05-25 22:36:09 -070044 assert(test_alloc_base::count == 0);
Howard Hinnantf39daa82010-08-28 21:01:06 +000045 {
Dan Albert1d4a1ed2016-05-25 22:36:09 -070046 std::promise<int&> p0(std::allocator_arg, test_allocator<int>());
47 std::promise<int&> p(std::allocator_arg, test_allocator<int>());
48 assert(test_alloc_base::count == 2);
49 p = p0;
50 assert(test_alloc_base::count == 1);
51 std::future<int&> f = p.get_future();
52 assert(test_alloc_base::count == 1);
53 assert(f.valid());
54 try
55 {
56 f = p0.get_future();
57 assert(false);
58 }
59 catch (const std::future_error& e)
60 {
61 assert(e.code() == make_error_code(std::future_errc::no_state));
62 }
63 assert(test_alloc_base::count == 1);
Howard Hinnantf39daa82010-08-28 21:01:06 +000064 }
Dan Albert1d4a1ed2016-05-25 22:36:09 -070065 assert(test_alloc_base::count == 0);
Howard Hinnantf39daa82010-08-28 21:01:06 +000066 {
Dan Albert1d4a1ed2016-05-25 22:36:09 -070067 std::promise<void> p0(std::allocator_arg, test_allocator<void>());
68 std::promise<void> p(std::allocator_arg, test_allocator<void>());
69 assert(test_alloc_base::count == 2);
70 p = p0;
71 assert(test_alloc_base::count == 1);
72 std::future<void> f = p.get_future();
73 assert(test_alloc_base::count == 1);
74 assert(f.valid());
75 try
76 {
77 f = p0.get_future();
78 assert(false);
79 }
80 catch (const std::future_error& e)
81 {
82 assert(e.code() == make_error_code(std::future_errc::no_state));
83 }
84 assert(test_alloc_base::count == 1);
Howard Hinnantf39daa82010-08-28 21:01:06 +000085 }
Dan Albert1d4a1ed2016-05-25 22:36:09 -070086 assert(test_alloc_base::count == 0);
Howard Hinnantf39daa82010-08-28 21:01:06 +000087}