1 // { dg-do run }
2 // { dg-additional-options "-pthread" { target pthread } }
3 // { dg-require-effective-target c++11 }
4 // { dg-require-gthreads "" }
5 
6 // Copyright (C) 2009-2021 Free Software Foundation, Inc.
7 //
8 // This file is part of the GNU ISO C++ Library.  This library is free
9 // software; you can redistribute it and/or modify it under the
10 // terms of the GNU General Public License as published by the
11 // Free Software Foundation; either version 3, or (at your option)
12 // any later version.
13 
14 // This library is distributed in the hope that it will be useful,
15 // but WITHOUT ANY WARRANTY; without even the implied warranty of
16 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 // GNU General Public License for more details.
18 
19 // You should have received a copy of the GNU General Public License along
20 // with this library; see the file COPYING3.  If not see
21 // <http://www.gnu.org/licenses/>.
22 
23 // Test that promise::set_exception stores an exception.
24 
25 #include <future>
26 #include <testsuite_hooks.h>
27 
test01()28 void test01()
29 {
30   bool test = false;
31 
32   std::promise<int> p1;
33   std::future<int> f1 = p1.get_future();
34 
35   VERIFY( f1.valid() );
36 
37   p1.set_exception(std::make_exception_ptr(0));
38 
39   try
40   {
41     f1.get();
42   }
43   catch (int)
44   {
45     test = true;
46   }
47   VERIFY( test );
48   VERIFY( !f1.valid() );
49 }
50 
test02()51 void test02()
52 {
53   bool test = false;
54 
55   std::promise<int&> p1;
56   std::future<int&> f1 = p1.get_future();
57 
58   VERIFY( f1.valid() );
59 
60   p1.set_exception(std::make_exception_ptr(0));
61 
62   try
63   {
64     f1.get();
65   }
66   catch (int)
67   {
68     test = true;
69   }
70   VERIFY( test );
71   VERIFY( !f1.valid() );
72 }
73 
test03()74 void test03()
75 {
76   bool test = false;
77 
78   std::promise<void> p1;
79   std::future<void> f1 = p1.get_future();
80 
81   VERIFY( f1.valid() );
82 
83   p1.set_exception(std::make_exception_ptr(0));
84 
85   try
86   {
87     f1.get();
88   }
89   catch (int)
90   {
91     test = true;
92   }
93   VERIFY( test );
94   VERIFY( !f1.valid() );
95 }
96 
main()97 int main()
98 {
99   test01();
100   test02();
101   test03();
102   return 0;
103 }
104