blob: 70a4e00b0d6af869d60b410597d7f3c939720e5d [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//===----------------------------------------------------------------------===//
Jonathan Roelofs8d86b2e2014-09-05 19:45:05 +00009//
10// UNSUPPORTED: libcpp-has-no-threads
Howard Hinnantf39daa82010-08-28 21:01:06 +000011
12// <future>
13
14// class promise<R>
15
16// template <class Allocator>
17// promise(allocator_arg_t, const Allocator& a);
18
19#include <future>
20#include <cassert>
21
Dan Albert1d4a1ed2016-05-25 22:36:09 -070022#include "../test_allocator.h"
Eric Fiselier4d2413c2014-10-23 06:24:45 +000023#include "min_allocator.h"
Howard Hinnantf39daa82010-08-28 21:01:06 +000024
25int main()
26{
Dan Albert1d4a1ed2016-05-25 22:36:09 -070027 assert(test_alloc_base::count == 0);
Howard Hinnantf39daa82010-08-28 21:01:06 +000028 {
Dan Albert1d4a1ed2016-05-25 22:36:09 -070029 std::promise<int> p(std::allocator_arg, test_allocator<int>());
30 assert(test_alloc_base::count == 1);
Howard Hinnantf39daa82010-08-28 21:01:06 +000031 std::future<int> f = p.get_future();
Dan Albert1d4a1ed2016-05-25 22:36:09 -070032 assert(test_alloc_base::count == 1);
Howard Hinnantf39daa82010-08-28 21:01:06 +000033 assert(f.valid());
34 }
Dan Albert1d4a1ed2016-05-25 22:36:09 -070035 assert(test_alloc_base::count == 0);
Howard Hinnantf39daa82010-08-28 21:01:06 +000036 {
Dan Albert1d4a1ed2016-05-25 22:36:09 -070037 std::promise<int&> p(std::allocator_arg, test_allocator<int>());
38 assert(test_alloc_base::count == 1);
Howard Hinnantf39daa82010-08-28 21:01:06 +000039 std::future<int&> f = p.get_future();
Dan Albert1d4a1ed2016-05-25 22:36:09 -070040 assert(test_alloc_base::count == 1);
Howard Hinnantf39daa82010-08-28 21:01:06 +000041 assert(f.valid());
42 }
Dan Albert1d4a1ed2016-05-25 22:36:09 -070043 assert(test_alloc_base::count == 0);
Howard Hinnantf39daa82010-08-28 21:01:06 +000044 {
Dan Albert1d4a1ed2016-05-25 22:36:09 -070045 std::promise<void> p(std::allocator_arg, test_allocator<void>());
46 assert(test_alloc_base::count == 1);
Howard Hinnantf39daa82010-08-28 21:01:06 +000047 std::future<void> f = p.get_future();
Dan Albert1d4a1ed2016-05-25 22:36:09 -070048 assert(test_alloc_base::count == 1);
Howard Hinnantf39daa82010-08-28 21:01:06 +000049 assert(f.valid());
50 }
Dan Albert1d4a1ed2016-05-25 22:36:09 -070051 assert(test_alloc_base::count == 0);
Eric Fiselier4d2413c2014-10-23 06:24:45 +000052 // Test with a minimal allocator
53 {
54 std::promise<int> p(std::allocator_arg, bare_allocator<void>());
55 std::future<int> f = p.get_future();
56 assert(f.valid());
57 }
58 {
59 std::promise<int&> p(std::allocator_arg, bare_allocator<void>());
60 std::future<int&> f = p.get_future();
61 assert(f.valid());
62 }
63 {
64 std::promise<void> p(std::allocator_arg, bare_allocator<void>());
65 std::future<void> f = p.get_future();
66 assert(f.valid());
67 }
68 // Test with a minimal allocator that returns class-type pointers
69 {
70 std::promise<int> p(std::allocator_arg, min_allocator<void>());
71 std::future<int> f = p.get_future();
72 assert(f.valid());
73 }
74 {
75 std::promise<int&> p(std::allocator_arg, min_allocator<void>());
76 std::future<int&> f = p.get_future();
77 assert(f.valid());
78 }
79 {
80 std::promise<void> p(std::allocator_arg, min_allocator<void>());
81 std::future<void> f = p.get_future();
82 assert(f.valid());
83 }
Howard Hinnantf39daa82010-08-28 21:01:06 +000084}