1 //===----------------------------------------------------------------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is dual licensed under the MIT and the University of Illinois Open
6 // Source Licenses. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // UNSUPPORTED: libcpp-has-no-threads
11 // UNSUPPORTED: c++98, c++03
15 // class packaged_task<R(ArgTypes...)>
17 // void operator()(ArgTypes... args);
22 #include "test_macros.h"
29 explicit A(long i) : data_(i) {}
31 long operator()(long i, long j) const
39 void func0(std::packaged_task<double(int, char)> p)
41 std::this_thread::sleep_for(std::chrono::milliseconds(500));
45 void func1(std::packaged_task<double(int, char)> p)
47 std::this_thread::sleep_for(std::chrono::milliseconds(500));
51 void func2(std::packaged_task<double(int, char)> p)
53 #ifndef TEST_HAS_NO_EXCEPTIONS
59 catch (const std::future_error& e)
61 assert(e.code() == make_error_code(std::future_errc::promise_already_satisfied));
68 void func3(std::packaged_task<double(int, char)> p)
70 #ifndef TEST_HAS_NO_EXCEPTIONS
75 catch (const std::future_error& e)
77 assert(e.code() == make_error_code(std::future_errc::no_state));
87 std::packaged_task<double(int, char)> p(A(5));
88 std::future<double> f = p.get_future();
89 std::thread(func0, std::move(p)).detach();
90 assert(f.get() == 105.0);
92 #ifndef TEST_HAS_NO_EXCEPTIONS
94 std::packaged_task<double(int, char)> p(A(5));
95 std::future<double> f = p.get_future();
96 std::thread(func1, std::move(p)).detach();
104 assert(e(3, 'a') == 106);
108 std::packaged_task<double(int, char)> p(A(5));
109 std::future<double> f = p.get_future();
110 std::thread t(func2, std::move(p));
111 assert(f.get() == 105.0);
115 std::packaged_task<double(int, char)> p;
116 std::thread t(func3, std::move(p));