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()28void 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()51void 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()74void 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()97int main() 98 { 99 test01(); 100 test02(); 101 test03(); 102 return 0; 103 } 104