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 // <future>
11 
12 // class future<R>
13 
14 // R future::get();
15 // R& future<R&>::get();
16 // void future<void>::get();
17 
18 #include <future>
19 #include <cassert>
20 
func1(std::promise<int> p)21 void func1(std::promise<int> p)
22 {
23     std::this_thread::sleep_for(std::chrono::milliseconds(500));
24     p.set_value(3);
25 }
26 
func2(std::promise<int> p)27 void func2(std::promise<int> p)
28 {
29     std::this_thread::sleep_for(std::chrono::milliseconds(500));
30     p.set_exception(std::make_exception_ptr(3));
31 }
32 
33 int j = 0;
34 
func3(std::promise<int &> p)35 void func3(std::promise<int&> p)
36 {
37     std::this_thread::sleep_for(std::chrono::milliseconds(500));
38     j = 5;
39     p.set_value(j);
40 }
41 
func4(std::promise<int &> p)42 void func4(std::promise<int&> p)
43 {
44     std::this_thread::sleep_for(std::chrono::milliseconds(500));
45     p.set_exception(std::make_exception_ptr(3.5));
46 }
47 
func5(std::promise<void> p)48 void func5(std::promise<void> p)
49 {
50     std::this_thread::sleep_for(std::chrono::milliseconds(500));
51     p.set_value();
52 }
53 
func6(std::promise<void> p)54 void func6(std::promise<void> p)
55 {
56     std::this_thread::sleep_for(std::chrono::milliseconds(500));
57     p.set_exception(std::make_exception_ptr('c'));
58 }
59 
main()60 int main()
61 {
62     {
63         typedef int T;
64         {
65             std::promise<T> p;
66             std::future<T> f = p.get_future();
67             std::thread(func1, std::move(p)).detach();
68             assert(f.valid());
69             assert(f.get() == 3);
70             assert(!f.valid());
71         }
72         {
73             std::promise<T> p;
74             std::future<T> f = p.get_future();
75             std::thread(func2, std::move(p)).detach();
76             try
77             {
78                 assert(f.valid());
79                 assert(f.get() == 3);
80                 assert(false);
81             }
82             catch (int i)
83             {
84                 assert(i == 3);
85             }
86             assert(!f.valid());
87         }
88     }
89     {
90         typedef int& T;
91         {
92             std::promise<T> p;
93             std::future<T> f = p.get_future();
94             std::thread(func3, std::move(p)).detach();
95             assert(f.valid());
96             assert(f.get() == 5);
97             assert(!f.valid());
98         }
99         {
100             std::promise<T> p;
101             std::future<T> f = p.get_future();
102             std::thread(func4, std::move(p)).detach();
103             try
104             {
105                 assert(f.valid());
106                 assert(f.get() == 3);
107                 assert(false);
108             }
109             catch (double i)
110             {
111                 assert(i == 3.5);
112             }
113             assert(!f.valid());
114         }
115     }
116     {
117         typedef void T;
118         {
119             std::promise<T> p;
120             std::future<T> f = p.get_future();
121             std::thread(func5, std::move(p)).detach();
122             assert(f.valid());
123             f.get();
124             assert(!f.valid());
125         }
126         {
127             std::promise<T> p;
128             std::future<T> f = p.get_future();
129             std::thread(func6, std::move(p)).detach();
130             try
131             {
132                 assert(f.valid());
133                 f.get();
134                 assert(false);
135             }
136             catch (char i)
137             {
138                 assert(i == 'c');
139             }
140             assert(!f.valid());
141         }
142     }
143 }
144