1 // { dg-do run { target *-*-freebsd* *-*-dragonfly* *-*-netbsd* *-*-linux* *-*-gnu* *-*-solaris* *-*-cygwin *-*-rtems* *-*-darwin* powerpc-ibm-aix* } } 2 // { dg-options "-pthread" { target *-*-freebsd* *-*-dragonfly* *-*-netbsd* *-*-linux* *-*-gnu* *-*-solaris* powerpc-ibm-aix* } } 3 // { dg-require-effective-target c++11 } 4 // { dg-require-cstdint "" } 5 // { dg-require-gthreads "" } 6 // { dg-require-atomic-builtins "" } 7 8 // Copyright (C) 2014-2017 Free Software Foundation, Inc. 9 // 10 // This file is part of the GNU ISO C++ Library. This library is free 11 // software; you can redistribute it and/or modify it under the 12 // terms of the GNU General Public License as published by the 13 // Free Software Foundation; either version 3, or (at your option) 14 // any later version. 15 16 // This library is distributed in the hope that it will be useful, 17 // but WITHOUT ANY WARRANTY; without even the implied warranty of 18 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 19 // GNU General Public License for more details. 20 21 // You should have received a copy of the GNU General Public License along 22 // with this library; see the file COPYING3. If not see 23 // <http://www.gnu.org/licenses/>. 24 25 // Test set_value_at_thread_exit error conditions 26 27 #include <future> 28 #include <testsuite_hooks.h> 29 test01()30void test01() 31 { 32 std::promise<int> p1; 33 p1.set_value(1); 34 try 35 { 36 p1.set_value_at_thread_exit(2); 37 VERIFY( false ); 38 } 39 catch (std::future_error& e) 40 { 41 VERIFY( e.code() == std::future_errc::promise_already_satisfied ); 42 } 43 try 44 { 45 p1.set_exception_at_thread_exit(std::make_exception_ptr(3)); 46 VERIFY( false ); 47 } 48 catch (std::future_error& e) 49 { 50 VERIFY( e.code() == std::future_errc::promise_already_satisfied ); 51 } 52 53 std::promise<int> p2(std::move(p1)); 54 try 55 { 56 p1.set_value_at_thread_exit(2); 57 VERIFY( false ); 58 } 59 catch (std::future_error& e) 60 { 61 VERIFY( e.code() == std::future_errc::no_state ); 62 } 63 try 64 { 65 p1.set_exception_at_thread_exit(std::make_exception_ptr(3)); 66 VERIFY( false ); 67 } 68 catch (std::future_error& e) 69 { 70 VERIFY( e.code() == std::future_errc::no_state ); 71 } 72 } 73 test02()74void test02() 75 { 76 std::promise<int&> p1; 77 int i = 1; 78 p1.set_value(i); 79 try 80 { 81 p1.set_value_at_thread_exit(i); 82 VERIFY( false ); 83 } 84 catch (std::future_error& e) 85 { 86 VERIFY( e.code() == std::future_errc::promise_already_satisfied ); 87 } 88 try 89 { 90 p1.set_exception_at_thread_exit(std::make_exception_ptr(3)); 91 VERIFY( false ); 92 } 93 catch (std::future_error& e) 94 { 95 VERIFY( e.code() == std::future_errc::promise_already_satisfied ); 96 } 97 98 std::promise<int&> p2(std::move(p1)); 99 try 100 { 101 int i = 0; 102 p1.set_value_at_thread_exit(i); 103 VERIFY( false ); 104 } 105 catch (std::future_error& e) 106 { 107 VERIFY( e.code() == std::future_errc::no_state ); 108 } 109 try 110 { 111 p1.set_exception_at_thread_exit(std::make_exception_ptr(3)); 112 VERIFY( false ); 113 } 114 catch (std::future_error& e) 115 { 116 VERIFY( e.code() == std::future_errc::no_state ); 117 } 118 } 119 test03()120void test03() 121 { 122 std::promise<void> p1; 123 int i = 0; 124 p1.set_value(); 125 try { 126 p1.set_value_at_thread_exit(); 127 VERIFY( false ); 128 } 129 catch (std::future_error& e) 130 { 131 VERIFY( e.code() == std::future_errc::promise_already_satisfied ); 132 } 133 try 134 { 135 p1.set_exception_at_thread_exit(std::make_exception_ptr(3)); 136 VERIFY( false ); 137 } 138 catch (std::future_error& e) 139 { 140 VERIFY( e.code() == std::future_errc::promise_already_satisfied ); 141 } 142 143 std::promise<void> p2(std::move(p1)); 144 try { 145 p1.set_value_at_thread_exit(); 146 VERIFY( false ); 147 } 148 catch (std::future_error& e) 149 { 150 VERIFY( e.code() == std::future_errc::no_state ); 151 } 152 try 153 { 154 p1.set_exception_at_thread_exit(std::make_exception_ptr(3)); 155 VERIFY( false ); 156 } 157 catch (std::future_error& e) 158 { 159 VERIFY( e.code() == std::future_errc::no_state ); 160 } 161 } 162 main()163int main() 164 { 165 test01(); 166 test02(); 167 test03(); 168 } 169