blob: 36a3555aed4687040b737d02f4a3c49b8c8c6424 [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(const promise&) = 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(p0);
27 assert(test_alloc_base::count == 1);
28 std::future<int> f = p.get_future();
29 assert(test_alloc_base::count == 1);
30 assert(f.valid());
31 try
32 {
33 f = p0.get_future();
34 assert(false);
35 }
36 catch (const std::future_error& e)
37 {
38 assert(e.code() == make_error_code(std::future_errc::no_state));
39 }
40 assert(test_alloc_base::count == 1);
Howard Hinnantf39daa82010-08-28 21:01:06 +000041 }
Dan Albert1d4a1ed2016-05-25 22:36:09 -070042 assert(test_alloc_base::count == 0);
Howard Hinnantf39daa82010-08-28 21:01:06 +000043 {
Dan Albert1d4a1ed2016-05-25 22:36:09 -070044 std::promise<int&> p0(std::allocator_arg, test_allocator<int>());
45 std::promise<int&> p(p0);
46 assert(test_alloc_base::count == 1);
47 std::future<int&> f = p.get_future();
48 assert(test_alloc_base::count == 1);
49 assert(f.valid());
50 try
51 {
52 f = p0.get_future();
53 assert(false);
54 }
55 catch (const std::future_error& e)
56 {
57 assert(e.code() == make_error_code(std::future_errc::no_state));
58 }
59 assert(test_alloc_base::count == 1);
Howard Hinnantf39daa82010-08-28 21:01:06 +000060 }
Dan Albert1d4a1ed2016-05-25 22:36:09 -070061 assert(test_alloc_base::count == 0);
Howard Hinnantf39daa82010-08-28 21:01:06 +000062 {
Dan Albert1d4a1ed2016-05-25 22:36:09 -070063 std::promise<void> p0(std::allocator_arg, test_allocator<void>());
64 std::promise<void> p(p0);
65 assert(test_alloc_base::count == 1);
66 std::future<void> f = p.get_future();
67 assert(test_alloc_base::count == 1);
68 assert(f.valid());
69 try
70 {
71 f = p0.get_future();
72 assert(false);
73 }
74 catch (const std::future_error& e)
75 {
76 assert(e.code() == make_error_code(std::future_errc::no_state));
77 }
78 assert(test_alloc_base::count == 1);
Howard Hinnantf39daa82010-08-28 21:01:06 +000079 }
Dan Albert1d4a1ed2016-05-25 22:36:09 -070080 assert(test_alloc_base::count == 0);
Howard Hinnantf39daa82010-08-28 21:01:06 +000081}