diff options
author | Eric Fiselier <eric@efcs.ca> | 2015-08-28 05:06:04 +0000 |
---|---|---|
committer | Eric Fiselier <eric@efcs.ca> | 2015-08-28 05:06:04 +0000 |
commit | 031a3d203ab2795050492d71da44179939b42bb3 (patch) | |
tree | 29b62b6cdf4c74a8f37fc55544a3f7ed8d30c492 /test | |
parent | 5ec04a92d24061c5332c2989bce999a5414d9d83 (diff) | |
download | external_libcxx-031a3d203ab2795050492d71da44179939b42bb3.tar.gz external_libcxx-031a3d203ab2795050492d71da44179939b42bb3.tar.bz2 external_libcxx-031a3d203ab2795050492d71da44179939b42bb3.zip |
[libcxx] Mark most test/std/future tests as UNSUPPORTED in C++03
Summary:
This patch marks *most* tests for `std::promise`, `std::future` and `std::shared_future` as unsupported in C++03. These tests fail in C++03 mode because they attempt to copy a `std::future` even though it is a `MoveOnly` type. AFAIK the missing move-semantics in `std::future` is the only reason these tests fail but without move semantics these classes are useless. For example even though `std::promise::set_value` and `std::promise::set_exception(...)` work in C++03 `std::promise` is still useless because we cannot call `std::promise::get_future(...)`.
It might be possible to hack `std::move(...)` like we do for `std::unique_ptr` to make the move semantics work but I don't think it is worth the effort. Instead I think we should leave the `<future>` header as-is and mark the failing tests as `UNSUPPORTED`. I don't believe there are any users of `std::future` or `std::promise` in C++03 because they are so unusable. Therefore I am not concerned about losing test coverage and possibly breaking users. However because there are still parts of `<future>` that work in C++03 it would be wrong to `#ifdef` out the entire header.
@mclow.lists Should we take further steps to prevent the use of `std::promise`, `std::future` and `std::shared_future` in C++03?
Note: This patch also cleans up the tests and converts them to use `support/test_allocator.h` instead of a duplicate class in `test/std/futures/test_allocator.h`.
Reviewers: mclow.lists
Subscribers: vsk, mclow.lists, cfe-commits
Differential Revision: http://reviews.llvm.org/D12135
git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@246271 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test')
39 files changed, 356 insertions, 603 deletions
diff --git a/test/libcxx/thread/futures/version.pass.cpp b/test/libcxx/thread/futures/version.pass.cpp new file mode 100644 index 000000000..6730a1477 --- /dev/null +++ b/test/libcxx/thread/futures/version.pass.cpp @@ -0,0 +1,22 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// UNSUPPORTED: libcpp-has-no-threads + +// <future> + +#include <future> + +#ifndef _LIBCPP_VERSION +#error _LIBCPP_VERSION not defined +#endif + +int main() +{ +} diff --git a/test/std/thread/futures/futures.promise/alloc_ctor.pass.cpp b/test/std/thread/futures/futures.promise/alloc_ctor.pass.cpp index 70a4e00b0..c0fe2ef88 100644 --- a/test/std/thread/futures/futures.promise/alloc_ctor.pass.cpp +++ b/test/std/thread/futures/futures.promise/alloc_ctor.pass.cpp @@ -8,6 +8,7 @@ //===----------------------------------------------------------------------===// // // UNSUPPORTED: libcpp-has-no-threads +// UNSUPPORTED: c++98, c++03 // <future> @@ -19,36 +20,36 @@ #include <future> #include <cassert> -#include "../test_allocator.h" +#include "test_allocator.h" #include "min_allocator.h" int main() { - assert(test_alloc_base::count == 0); + assert(test_alloc_base::alloc_count == 0); { - std::promise<int> p(std::allocator_arg, test_allocator<int>()); - assert(test_alloc_base::count == 1); + std::promise<int> p(std::allocator_arg, test_allocator<int>(42)); + assert(test_alloc_base::alloc_count == 1); std::future<int> f = p.get_future(); - assert(test_alloc_base::count == 1); + assert(test_alloc_base::alloc_count == 1); assert(f.valid()); } - assert(test_alloc_base::count == 0); + assert(test_alloc_base::alloc_count == 0); { - std::promise<int&> p(std::allocator_arg, test_allocator<int>()); - assert(test_alloc_base::count == 1); + std::promise<int&> p(std::allocator_arg, test_allocator<int>(42)); + assert(test_alloc_base::alloc_count == 1); std::future<int&> f = p.get_future(); - assert(test_alloc_base::count == 1); + assert(test_alloc_base::alloc_count == 1); assert(f.valid()); } - assert(test_alloc_base::count == 0); + assert(test_alloc_base::alloc_count == 0); { - std::promise<void> p(std::allocator_arg, test_allocator<void>()); - assert(test_alloc_base::count == 1); + std::promise<void> p(std::allocator_arg, test_allocator<void>(42)); + assert(test_alloc_base::alloc_count == 1); std::future<void> f = p.get_future(); - assert(test_alloc_base::count == 1); + assert(test_alloc_base::alloc_count == 1); assert(f.valid()); } - assert(test_alloc_base::count == 0); + assert(test_alloc_base::alloc_count == 0); // Test with a minimal allocator { std::promise<int> p(std::allocator_arg, bare_allocator<void>()); diff --git a/test/std/thread/futures/futures.promise/copy_assign.fail.cpp b/test/std/thread/futures/futures.promise/copy_assign.fail.cpp index c08278122..e150ba0df 100644 --- a/test/std/thread/futures/futures.promise/copy_assign.fail.cpp +++ b/test/std/thread/futures/futures.promise/copy_assign.fail.cpp @@ -14,74 +14,36 @@ // promise& operator=(const promise& rhs) = delete; #include <future> -#include <cassert> -#include "../test_allocator.h" +#include "test_macros.h" int main() { - assert(test_alloc_base::count == 0); +#if TEST_STD_VER >= 11 { - std::promise<int> p0(std::allocator_arg, test_allocator<int>()); - std::promise<int> p(std::allocator_arg, test_allocator<int>()); - assert(test_alloc_base::count == 2); - p = p0; - assert(test_alloc_base::count == 1); - std::future<int> f = p.get_future(); - assert(test_alloc_base::count == 1); - assert(f.valid()); - try - { - f = p0.get_future(); - assert(false); - } - catch (const std::future_error& e) - { - assert(e.code() == make_error_code(std::future_errc::no_state)); - } - assert(test_alloc_base::count == 1); + std::promise<int> p0, p; + p = p0; // expected-error {{overload resolution selected deleted operator '='}} } - assert(test_alloc_base::count == 0); { - std::promise<int&> p0(std::allocator_arg, test_allocator<int>()); - std::promise<int&> p(std::allocator_arg, test_allocator<int>()); - assert(test_alloc_base::count == 2); - p = p0; - assert(test_alloc_base::count == 1); - std::future<int&> f = p.get_future(); - assert(test_alloc_base::count == 1); - assert(f.valid()); - try - { - f = p0.get_future(); - assert(false); - } - catch (const std::future_error& e) - { - assert(e.code() == make_error_code(std::future_errc::no_state)); - } - assert(test_alloc_base::count == 1); + std::promise<int&> p0, p; + p = p0; // expected-error {{overload resolution selected deleted operator '='}} } - assert(test_alloc_base::count == 0); { - std::promise<void> p0(std::allocator_arg, test_allocator<void>()); - std::promise<void> p(std::allocator_arg, test_allocator<void>()); - assert(test_alloc_base::count == 2); - p = p0; - assert(test_alloc_base::count == 1); - std::future<void> f = p.get_future(); - assert(test_alloc_base::count == 1); - assert(f.valid()); - try - { - f = p0.get_future(); - assert(false); - } - catch (const std::future_error& e) - { - assert(e.code() == make_error_code(std::future_errc::no_state)); - } - assert(test_alloc_base::count == 1); + std::promise<void> p0, p; + p = p0; // expected-error {{overload resolution selected deleted operator '='}} } - assert(test_alloc_base::count == 0); +#else + { + std::promise<int> p0, p; + p = p0; // expected-error {{'operator=' is a private member of 'std::__1::promise<int>'}} + } + { + std::promise<int&> p0, p; + p = p0; // expected-error {{'operator=' is a private member of 'std::__1::promise<int &>'}} + } + { + std::promise<void> p0, p; + p = p0; // expected-error {{'operator=' is a private member of 'std::__1::promise<void>'}} + } +#endif } diff --git a/test/std/thread/futures/futures.promise/copy_ctor.fail.cpp b/test/std/thread/futures/futures.promise/copy_ctor.fail.cpp index 36a3555ae..34becbc12 100644 --- a/test/std/thread/futures/futures.promise/copy_ctor.fail.cpp +++ b/test/std/thread/futures/futures.promise/copy_ctor.fail.cpp @@ -14,68 +14,36 @@ // promise(const promise&) = delete; #include <future> -#include <cassert> -#include "../test_allocator.h" +#include "test_macros.h" int main() { - assert(test_alloc_base::count == 0); +#if TEST_STD_VER >= 11 { - std::promise<int> p0(std::allocator_arg, test_allocator<int>()); - std::promise<int> p(p0); - assert(test_alloc_base::count == 1); - std::future<int> f = p.get_future(); - assert(test_alloc_base::count == 1); - assert(f.valid()); - try - { - f = p0.get_future(); - assert(false); - } - catch (const std::future_error& e) - { - assert(e.code() == make_error_code(std::future_errc::no_state)); - } - assert(test_alloc_base::count == 1); + std::promise<int> p0; + std::promise<int> p(p0); // expected-error {{call to deleted constructor of 'std::promise<int>'}} } - assert(test_alloc_base::count == 0); { - std::promise<int&> p0(std::allocator_arg, test_allocator<int>()); - std::promise<int&> p(p0); - assert(test_alloc_base::count == 1); - std::future<int&> f = p.get_future(); - assert(test_alloc_base::count == 1); - assert(f.valid()); - try - { - f = p0.get_future(); - assert(false); - } - catch (const std::future_error& e) - { - assert(e.code() == make_error_code(std::future_errc::no_state)); - } - assert(test_alloc_base::count == 1); + std::promise<int &> p0; + std::promise<int &> p(p0); // expected-error {{call to deleted constructor of 'std::promise<int &>'}} } - assert(test_alloc_base::count == 0); { - std::promise<void> p0(std::allocator_arg, test_allocator<void>()); - std::promise<void> p(p0); - assert(test_alloc_base::count == 1); - std::future<void> f = p.get_future(); - assert(test_alloc_base::count == 1); - assert(f.valid()); - try - { - f = p0.get_future(); - assert(false); - } - catch (const std::future_error& e) - { - assert(e.code() == make_error_code(std::future_errc::no_state)); - } - assert(test_alloc_base::count == 1); + std::promise<void> p0; + std::promise<void> p(p0); // expected-error {{call to deleted constructor of 'std::promise<void>'}} } - assert(test_alloc_base::count == 0); +#else + { + std::promise<int> p0; + std::promise<int> p(p0); // expected-error {{calling a private constructor of class 'std::__1::promise<int>'}} + } + { + std::promise<int &> p0; + std::promise<int &> p(p0); // expected-error {{calling a private constructor of class 'std::__1::promise<int &>'}} + } + { + std::promise<void> p0; + std::promise<void> p(p0); // expected-error {{calling a private constructor of class 'std::__1::promise<void>'}} + } +#endif } diff --git a/test/std/thread/futures/futures.promise/default.pass.cpp b/test/std/thread/futures/futures.promise/default.pass.cpp index 95c9657c6..d108b4275 100644 --- a/test/std/thread/futures/futures.promise/default.pass.cpp +++ b/test/std/thread/futures/futures.promise/default.pass.cpp @@ -8,6 +8,7 @@ //===----------------------------------------------------------------------===// // // UNSUPPORTED: libcpp-has-no-threads +// UNSUPPORTED: c++98, c++03 // <future> diff --git a/test/std/thread/futures/futures.promise/dtor.pass.cpp b/test/std/thread/futures/futures.promise/dtor.pass.cpp index 78912f12a..a28e886bc 100644 --- a/test/std/thread/futures/futures.promise/dtor.pass.cpp +++ b/test/std/thread/futures/futures.promise/dtor.pass.cpp @@ -8,6 +8,7 @@ //===----------------------------------------------------------------------===// // // UNSUPPORTED: libcpp-has-no-threads +// UNSUPPORTED: c++98, c++03 // <future> diff --git a/test/std/thread/futures/futures.promise/get_future.pass.cpp b/test/std/thread/futures/futures.promise/get_future.pass.cpp index a7d084ee7..8392c9f7b 100644 --- a/test/std/thread/futures/futures.promise/get_future.pass.cpp +++ b/test/std/thread/futures/futures.promise/get_future.pass.cpp @@ -8,6 +8,7 @@ //===----------------------------------------------------------------------===// // // UNSUPPORTED: libcpp-has-no-threads +// UNSUPPORTED: c++98, c++03 // <future> diff --git a/test/std/thread/futures/futures.promise/move_assign.pass.cpp b/test/std/thread/futures/futures.promise/move_assign.pass.cpp index c3097df74..80f4046db 100644 --- a/test/std/thread/futures/futures.promise/move_assign.pass.cpp +++ b/test/std/thread/futures/futures.promise/move_assign.pass.cpp @@ -8,6 +8,7 @@ //===----------------------------------------------------------------------===// // // UNSUPPORTED: libcpp-has-no-threads +// UNSUPPORTED: c++98, c++03 // <future> @@ -18,20 +19,19 @@ #include <future> #include <cassert> -#include "../test_allocator.h" +#include "test_allocator.h" int main() { -#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES - assert(test_alloc_base::count == 0); + assert(test_alloc_base::alloc_count == 0); { std::promise<int> p0(std::allocator_arg, test_allocator<int>()); std::promise<int> p(std::allocator_arg, test_allocator<int>()); - assert(test_alloc_base::count == 2); + assert(test_alloc_base::alloc_count == 2); p = std::move(p0); - assert(test_alloc_base::count == 1); + assert(test_alloc_base::alloc_count == 1); std::future<int> f = p.get_future(); - assert(test_alloc_base::count == 1); + assert(test_alloc_base::alloc_count == 1); assert(f.valid()); try { @@ -42,17 +42,17 @@ int main() { assert(e.code() == make_error_code(std::future_errc::no_state)); } - assert(test_alloc_base::count == 1); + assert(test_alloc_base::alloc_count == 1); } - assert(test_alloc_base::count == 0); + assert(test_alloc_base::alloc_count == 0); { std::promise<int&> p0(std::allocator_arg, test_allocator<int>()); std::promise<int&> p(std::allocator_arg, test_allocator<int>()); - assert(test_alloc_base::count == 2); + assert(test_alloc_base::alloc_count == 2); p = std::move(p0); - assert(test_alloc_base::count == 1); + assert(test_alloc_base::alloc_count == 1); std::future<int&> f = p.get_future(); - assert(test_alloc_base::count == 1); + assert(test_alloc_base::alloc_count == 1); assert(f.valid()); try { @@ -63,17 +63,17 @@ int main() { assert(e.code() == make_error_code(std::future_errc::no_state)); } - assert(test_alloc_base::count == 1); + assert(test_alloc_base::alloc_count == 1); } - assert(test_alloc_base::count == 0); + assert(test_alloc_base::alloc_count == 0); { std::promise<void> p0(std::allocator_arg, test_allocator<void>()); std::promise<void> p(std::allocator_arg, test_allocator<void>()); - assert(test_alloc_base::count == 2); + assert(test_alloc_base::alloc_count == 2); p = std::move(p0); - assert(test_alloc_base::count == 1); + assert(test_alloc_base::alloc_count == 1); std::future<void> f = p.get_future(); - assert(test_alloc_base::count == 1); + assert(test_alloc_base::alloc_count == 1); assert(f.valid()); try { @@ -84,8 +84,7 @@ int main() { assert(e.code() == make_error_code(std::future_errc::no_state)); } - assert(test_alloc_base::count == 1); + assert(test_alloc_base::alloc_count == 1); } - assert(test_alloc_base::count == 0); -#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + assert(test_alloc_base::alloc_count == 0); } diff --git a/test/std/thread/futures/futures.promise/move_ctor.pass.cpp b/test/std/thread/futures/futures.promise/move_ctor.pass.cpp index eeec4fb15..d45c48a95 100644 --- a/test/std/thread/futures/futures.promise/move_ctor.pass.cpp +++ b/test/std/thread/futures/futures.promise/move_ctor.pass.cpp @@ -8,6 +8,7 @@ //===----------------------------------------------------------------------===// // // UNSUPPORTED: libcpp-has-no-threads +// UNSUPPORTED: c++98, c++03 // <future> @@ -18,18 +19,17 @@ #include <future> #include <cassert> -#include "../test_allocator.h" +#include "test_allocator.h" int main() { -#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES - assert(test_alloc_base::count == 0); + assert(test_alloc_base::alloc_count == 0); { std::promise<int> p0(std::allocator_arg, test_allocator<int>()); std::promise<int> p(std::move(p0)); - assert(test_alloc_base::count == 1); + assert(test_alloc_base::alloc_count == 1); std::future<int> f = p.get_future(); - assert(test_alloc_base::count == 1); + assert(test_alloc_base::alloc_count == 1); assert(f.valid()); try { @@ -40,15 +40,15 @@ int main() { assert(e.code() == make_error_code(std::future_errc::no_state)); } - assert(test_alloc_base::count == 1); + assert(test_alloc_base::alloc_count == 1); } - assert(test_alloc_base::count == 0); + assert(test_alloc_base::alloc_count == 0); { std::promise<int&> p0(std::allocator_arg, test_allocator<int>()); std::promise<int&> p(std::move(p0)); - assert(test_alloc_base::count == 1); + assert(test_alloc_base::alloc_count == 1); std::future<int&> f = p.get_future(); - assert(test_alloc_base::count == 1); + assert(test_alloc_base::alloc_count == 1); assert(f.valid()); try { @@ -59,15 +59,15 @@ int main() { assert(e.code() == make_error_code(std::future_errc::no_state)); } - assert(test_alloc_base::count == 1); + assert(test_alloc_base::alloc_count == 1); } - assert(test_alloc_base::count == 0); + assert(test_alloc_base::alloc_count == 0); { std::promise<void> p0(std::allocator_arg, test_allocator<void>()); std::promise<void> p(std::move(p0)); - assert(test_alloc_base::count == 1); + assert(test_alloc_base::alloc_count == 1); std::future<void> f = p.get_future(); - assert(test_alloc_base::count == 1); + assert(test_alloc_base::alloc_count == 1); assert(f.valid()); try { @@ -78,8 +78,7 @@ int main() { assert(e.code() == make_error_code(std::future_errc::no_state)); } - assert(test_alloc_base::count == 1); + assert(test_alloc_base::alloc_count == 1); } - assert(test_alloc_base::count == 0); -#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + assert(test_alloc_base::alloc_count == 0); } diff --git a/test/std/thread/futures/futures.promise/set_exception.pass.cpp b/test/std/thread/futures/futures.promise/set_exception.pass.cpp index 51c05eb80..00668f18e 100644 --- a/test/std/thread/futures/futures.promise/set_exception.pass.cpp +++ b/test/std/thread/futures/futures.promise/set_exception.pass.cpp @@ -8,6 +8,7 @@ //===----------------------------------------------------------------------===// // // UNSUPPORTED: libcpp-has-no-threads +// UNSUPPORTED: c++98, c++03 // <future> diff --git a/test/std/thread/futures/futures.promise/set_exception_at_thread_exit.pass.cpp b/test/std/thread/futures/futures.promise/set_exception_at_thread_exit.pass.cpp index 5e5769256..77a6d123e 100644 --- a/test/std/thread/futures/futures.promise/set_exception_at_thread_exit.pass.cpp +++ b/test/std/thread/futures/futures.promise/set_exception_at_thread_exit.pass.cpp @@ -8,6 +8,7 @@ //===----------------------------------------------------------------------===// // // UNSUPPORTED: libcpp-has-no-threads +// UNSUPPORTED: c++98, c++03 // <future> diff --git a/test/std/thread/futures/futures.promise/set_lvalue.pass.cpp b/test/std/thread/futures/futures.promise/set_lvalue.pass.cpp index cdc377750..5a75429ac 100644 --- a/test/std/thread/futures/futures.promise/set_lvalue.pass.cpp +++ b/test/std/thread/futures/futures.promise/set_lvalue.pass.cpp @@ -8,6 +8,7 @@ //===----------------------------------------------------------------------===// // // UNSUPPORTED: libcpp-has-no-threads +// UNSUPPORTED: c++98, c++03 // <future> diff --git a/test/std/thread/futures/futures.promise/set_lvalue_at_thread_exit.pass.cpp b/test/std/thread/futures/futures.promise/set_lvalue_at_thread_exit.pass.cpp index 18f87c596..e127d2c37 100644 --- a/test/std/thread/futures/futures.promise/set_lvalue_at_thread_exit.pass.cpp +++ b/test/std/thread/futures/futures.promise/set_lvalue_at_thread_exit.pass.cpp @@ -8,6 +8,7 @@ //===----------------------------------------------------------------------===// // // UNSUPPORTED: libcpp-has-no-threads +// UNSUPPORTED: c++98, c++03 // <future> diff --git a/test/std/thread/futures/futures.promise/set_value_at_thread_exit_const.pass.cpp b/test/std/thread/futures/futures.promise/set_value_at_thread_exit_const.pass.cpp index ec50cc310..79137488e 100644 --- a/test/std/thread/futures/futures.promise/set_value_at_thread_exit_const.pass.cpp +++ b/test/std/thread/futures/futures.promise/set_value_at_thread_exit_const.pass.cpp @@ -8,6 +8,7 @@ //===----------------------------------------------------------------------===// // // UNSUPPORTED: libcpp-has-no-threads +// UNSUPPORTED: c++98, c++03 // <future> diff --git a/test/std/thread/futures/futures.promise/set_value_at_thread_exit_void.pass.cpp b/test/std/thread/futures/futures.promise/set_value_at_thread_exit_void.pass.cpp index 8c0920846..6a0ce3632 100644 --- a/test/std/thread/futures/futures.promise/set_value_at_thread_exit_void.pass.cpp +++ b/test/std/thread/futures/futures.promise/set_value_at_thread_exit_void.pass.cpp @@ -8,6 +8,7 @@ //===----------------------------------------------------------------------===// // // UNSUPPORTED: libcpp-has-no-threads +// UNSUPPORTED: c++98, c++03 // <future> diff --git a/test/std/thread/futures/futures.promise/set_value_const.pass.cpp b/test/std/thread/futures/futures.promise/set_value_const.pass.cpp index 6673f6307..315956d4a 100644 --- a/test/std/thread/futures/futures.promise/set_value_const.pass.cpp +++ b/test/std/thread/futures/futures.promise/set_value_const.pass.cpp @@ -8,6 +8,7 @@ //===----------------------------------------------------------------------===// // // UNSUPPORTED: libcpp-has-no-threads +// UNSUPPORTED: c++98, c++03 // <future> diff --git a/test/std/thread/futures/futures.promise/set_value_void.pass.cpp b/test/std/thread/futures/futures.promise/set_value_void.pass.cpp index 5012e0bfe..5ede08191 100644 --- a/test/std/thread/futures/futures.promise/set_value_void.pass.cpp +++ b/test/std/thread/futures/futures.promise/set_value_void.pass.cpp @@ -8,6 +8,7 @@ //===----------------------------------------------------------------------===// // // UNSUPPORTED: libcpp-has-no-threads +// UNSUPPORTED: c++98, c++03 // <future> diff --git a/test/std/thread/futures/futures.promise/swap.pass.cpp b/test/std/thread/futures/futures.promise/swap.pass.cpp index 1ed3e6468..21c946981 100644 --- a/test/std/thread/futures/futures.promise/swap.pass.cpp +++ b/test/std/thread/futures/futures.promise/swap.pass.cpp @@ -8,6 +8,7 @@ //===----------------------------------------------------------------------===// // // UNSUPPORTED: libcpp-has-no-threads +// UNSUPPORTED: c++98, c++03 // <future> @@ -20,65 +21,65 @@ #include <future> #include <cassert> -#include "../test_allocator.h" +#include "test_allocator.h" int main() { - assert(test_alloc_base::count == 0); + assert(test_alloc_base::alloc_count == 0); { std::promise<int> p0(std::allocator_arg, test_allocator<int>()); std::promise<int> p(std::allocator_arg, test_allocator<int>()); - assert(test_alloc_base::count == 2); + assert(test_alloc_base::alloc_count == 2); p.swap(p0); - assert(test_alloc_base::count == 2); + assert(test_alloc_base::alloc_count == 2); std::future<int> f = p.get_future(); - assert(test_alloc_base::count == 2); + assert(test_alloc_base::alloc_count == 2); assert(f.valid()); f = p0.get_future(); assert(f.valid()); - assert(test_alloc_base::count == 2); + assert(test_alloc_base::alloc_count == 2); } - assert(test_alloc_base::count == 0); + assert(test_alloc_base::alloc_count == 0); { std::promise<int> p0(std::allocator_arg, test_allocator<int>()); std::promise<int> p(std::allocator_arg, test_allocator<int>()); - assert(test_alloc_base::count == 2); + assert(test_alloc_base::alloc_count == 2); swap(p, p0); - assert(test_alloc_base::count == 2); + assert(test_alloc_base::alloc_count == 2); std::future<int> f = p.get_future(); - assert(test_alloc_base::count == 2); + assert(test_alloc_base::alloc_count == 2); assert(f.valid()); f = p0.get_future(); assert(f.valid()); - assert(test_alloc_base::count == 2); + assert(test_alloc_base::alloc_count == 2); } - assert(test_alloc_base::count == 0); + assert(test_alloc_base::alloc_count == 0); { std::promise<int> p0(std::allocator_arg, test_allocator<int>()); std::promise<int> p; - assert(test_alloc_base::count == 1); + assert(test_alloc_base::alloc_count == 1); p.swap(p0); - assert(test_alloc_base::count == 1); + assert(test_alloc_base::alloc_count == 1); std::future<int> f = p.get_future(); - assert(test_alloc_base::count == 1); + assert(test_alloc_base::alloc_count == 1); assert(f.valid()); f = p0.get_future(); assert(f.valid()); - assert(test_alloc_base::count == 1); + assert(test_alloc_base::alloc_count == 1); } - assert(test_alloc_base::count == 0); + assert(test_alloc_base::alloc_count == 0); { std::promise<int> p0(std::allocator_arg, test_allocator<int>()); std::promise<int> p; - assert(test_alloc_base::count == 1); + assert(test_alloc_base::alloc_count == 1); swap(p, p0); - assert(test_alloc_base::count == 1); + assert(test_alloc_base::alloc_count == 1); std::future<int> f = p.get_future(); - assert(test_alloc_base::count == 1); + assert(test_alloc_base::alloc_count == 1); assert(f.valid()); f = p0.get_future(); assert(f.valid()); - assert(test_alloc_base::count == 1); + assert(test_alloc_base::alloc_count == 1); } - assert(test_alloc_base::count == 0); + assert(test_alloc_base::alloc_count == 0); } diff --git a/test/std/thread/futures/futures.promise/uses_allocator.pass.cpp b/test/std/thread/futures/futures.promise/uses_allocator.pass.cpp index 458826e95..9a1d41cc0 100644 --- a/test/std/thread/futures/futures.promise/uses_allocator.pass.cpp +++ b/test/std/thread/futures/futures.promise/uses_allocator.pass.cpp @@ -18,7 +18,7 @@ // : true_type { }; #include <future> -#include "../test_allocator.h" +#include "test_allocator.h" int main() { diff --git a/test/std/thread/futures/futures.shared_future/copy_assign.pass.cpp b/test/std/thread/futures/futures.shared_future/copy_assign.pass.cpp index b23ba196e..3f9e945dd 100644 --- a/test/std/thread/futures/futures.shared_future/copy_assign.pass.cpp +++ b/test/std/thread/futures/futures.shared_future/copy_assign.pass.cpp @@ -8,6 +8,7 @@ //===----------------------------------------------------------------------===// // // UNSUPPORTED: libcpp-has-no-threads +// UNSUPPORTED: c++98, c++03 // <future> @@ -20,7 +21,6 @@ int main() { -#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES { typedef int T; std::promise<T> p; @@ -72,5 +72,4 @@ int main() assert(!f0.valid()); assert(!f.valid()); } -#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES } diff --git a/test/std/thread/futures/futures.shared_future/copy_ctor.pass.cpp b/test/std/thread/futures/futures.shared_future/copy_ctor.pass.cpp index 425d1f9be..1da08808d 100644 --- a/test/std/thread/futures/futures.shared_future/copy_ctor.pass.cpp +++ b/test/std/thread/futures/futures.shared_future/copy_ctor.pass.cpp @@ -8,6 +8,7 @@ //===----------------------------------------------------------------------===// // // UNSUPPORTED: libcpp-has-no-threads +// UNSUPPORTED: c++98, c++03 // <future> diff --git a/test/std/thread/futures/futures.shared_future/ctor_future.pass.cpp b/test/std/thread/futures/futures.shared_future/ctor_future.pass.cpp index 3a78b80f0..1590efd7b 100644 --- a/test/std/thread/futures/futures.shared_future/ctor_future.pass.cpp +++ b/test/std/thread/futures/futures.shared_future/ctor_future.pass.cpp @@ -8,6 +8,7 @@ //===----------------------------------------------------------------------===// // // UNSUPPORTED: libcpp-has-no-threads +// UNSUPPORTED: c++98, c++03 // <future> diff --git a/test/std/thread/futures/futures.shared_future/dtor.pass.cpp b/test/std/thread/futures/futures.shared_future/dtor.pass.cpp index baa89cb12..583e09ff5 100644 --- a/test/std/thread/futures/futures.shared_future/dtor.pass.cpp +++ b/test/std/thread/futures/futures.shared_future/dtor.pass.cpp @@ -8,6 +8,7 @@ //===----------------------------------------------------------------------===// // // UNSUPPORTED: libcpp-has-no-threads +// UNSUPPORTED: c++98, c++03 // <future> @@ -18,51 +19,51 @@ #include <future> #include <cassert> -#include "../test_allocator.h" +#include "test_allocator.h" int main() { - assert(test_alloc_base::count == 0); + assert(test_alloc_base::alloc_count == 0); { typedef int T; std::shared_future<T> f; { std::promise<T> p(std::allocator_arg, test_allocator<T>()); - assert(test_alloc_base::count == 1); + assert(test_alloc_base::alloc_count == 1); f = p.get_future(); - assert(test_alloc_base::count == 1); + assert(test_alloc_base::alloc_count == 1); assert(f.valid()); } - assert(test_alloc_base::count == 1); + assert(test_alloc_base::alloc_count == 1); assert(f.valid()); } - assert(test_alloc_base::count == 0); + assert(test_alloc_base::alloc_count == 0); { typedef int& T; std::shared_future<T> f; { std::promise<T> p(std::allocator_arg, test_allocator<int>()); - assert(test_alloc_base::count == 1); + assert(test_alloc_base::alloc_count == 1); f = p.get_future(); - assert(test_alloc_base::count == 1); + assert(test_alloc_base::alloc_count == 1); assert(f.valid()); } - assert(test_alloc_base::count == 1); + assert(test_alloc_base::alloc_count == 1); assert(f.valid()); } - assert(test_alloc_base::count == 0); + assert(test_alloc_base::alloc_count == 0); { typedef void T; std::shared_future<T> f; { std::promise<T> p(std::allocator_arg, test_allocator<T>()); - assert(test_alloc_base::count == 1); + assert(test_alloc_base::alloc_count == 1); f = p.get_future(); - assert(test_alloc_base::count == 1); + assert(test_alloc_base::alloc_count == 1); assert(f.valid()); } - assert(test_alloc_base::count == 1); + assert(test_alloc_base::alloc_count == 1); assert(f.valid()); } - assert(test_alloc_base::count == 0); + assert(test_alloc_base::alloc_count == 0); } diff --git a/test/std/thread/futures/futures.shared_future/get.pass.cpp b/test/std/thread/futures/futures.shared_future/get.pass.cpp index c5ee234b1..dff83271e 100644 --- a/test/std/thread/futures/futures.shared_future/get.pass.cpp +++ b/test/std/thread/futures/futures.shared_future/get.pass.cpp @@ -8,6 +8,7 @@ //===----------------------------------------------------------------------===// // // UNSUPPORTED: libcpp-has-no-threads +// UNSUPPORTED: c++98, c++03 // <future> diff --git a/test/std/thread/futures/futures.shared_future/move_assign.pass.cpp b/test/std/thread/futures/futures.shared_future/move_assign.pass.cpp index 6b58f41c9..3a1ef7a68 100644 --- a/test/std/thread/futures/futures.shared_future/move_assign.pass.cpp +++ b/test/std/thread/futures/futures.shared_future/move_assign.pass.cpp @@ -8,6 +8,7 @@ //===----------------------------------------------------------------------===// // // UNSUPPORTED: libcpp-has-no-threads +// UNSUPPORTED: c++98, c++03 // <future> @@ -20,7 +21,6 @@ int main() { -#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES { typedef int T; std::promise<T> p; @@ -72,5 +72,4 @@ int main() assert(!f0.valid()); assert(!f.valid()); } -#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES } diff --git a/test/std/thread/futures/futures.shared_future/move_ctor.pass.cpp b/test/std/thread/futures/futures.shared_future/move_ctor.pass.cpp index 32b8fd77c..15323d678 100644 --- a/test/std/thread/futures/futures.shared_future/move_ctor.pass.cpp +++ b/test/std/thread/futures/futures.shared_future/move_ctor.pass.cpp @@ -8,6 +8,7 @@ //===----------------------------------------------------------------------===// // // UNSUPPORTED: libcpp-has-no-threads +// UNSUPPORTED: c++98, c++03 // <future> diff --git a/test/std/thread/futures/futures.shared_future/wait.pass.cpp b/test/std/thread/futures/futures.shared_future/wait.pass.cpp index 4293fcab3..6ff74f6c6 100644 --- a/test/std/thread/futures/futures.shared_future/wait.pass.cpp +++ b/test/std/thread/futures/futures.shared_future/wait.pass.cpp @@ -8,6 +8,7 @@ //===----------------------------------------------------------------------===// // // UNSUPPORTED: libcpp-has-no-threads +// UNSUPPORTED: c++98, c++03 // <future> diff --git a/test/std/thread/futures/futures.shared_future/wait_for.pass.cpp b/test/std/thread/futures/futures.shared_future/wait_for.pass.cpp index e5a4754e3..1ec086266 100644 --- a/test/std/thread/futures/futures.shared_future/wait_for.pass.cpp +++ b/test/std/thread/futures/futures.shared_future/wait_for.pass.cpp @@ -8,6 +8,7 @@ //===----------------------------------------------------------------------===// // // UNSUPPORTED: libcpp-has-no-threads +// UNSUPPORTED: c++98, c++03 // <future> diff --git a/test/std/thread/futures/futures.shared_future/wait_until.pass.cpp b/test/std/thread/futures/futures.shared_future/wait_until.pass.cpp index 6a6aeba77..9cdc2e431 100644 --- a/test/std/thread/futures/futures.shared_future/wait_until.pass.cpp +++ b/test/std/thread/futures/futures.shared_future/wait_until.pass.cpp @@ -8,6 +8,7 @@ //===----------------------------------------------------------------------===// // // UNSUPPORTED: libcpp-has-no-threads + // UNSUPPORTED: c++98, c++03 // <future> diff --git a/test/std/thread/futures/futures.unique_future/copy_assign.fail.cpp b/test/std/thread/futures/futures.unique_future/copy_assign.fail.cpp index ebdcbf98d..781c9c9d6 100644 --- a/test/std/thread/futures/futures.unique_future/copy_assign.fail.cpp +++ b/test/std/thread/futures/futures.unique_future/copy_assign.fail.cpp @@ -14,61 +14,36 @@ // future& operator=(const future&) = delete; #include <future> -#include <cassert> + +#include "test_macros.h" int main() { -#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES +#if TEST_STD_VER >= 11 { - typedef int T; - std::promise<T> p; - std::future<T> f0 = p.get_future(); - std::future<T> f; - f = f0; - assert(!f0.valid()); - assert(f.valid()); + std::future<int> f0, f; + f = f0; // expected-error {{overload resolution selected deleted operator '='}} } { - typedef int T; - std::future<T> f0; - std::future<T> f; - f = f0; - assert(!f0.valid()); - assert(!f.valid()); + std::future<int &> f0, f; + f = f0; // expected-error {{overload resolution selected deleted operator '='}} } { - typedef int& T; - std::promise<T> p; - std::future<T> f0 = p.get_future(); - std::future<T> f; - f = f0; - assert(!f0.valid()); - assert(f.valid()); + std::future<void> f0, f; + f = f0; // expected-error {{overload resolution selected deleted operator '='}} } +#else { - typedef int& T; - std::future<T> f0; - std::future<T> f; - f = f0; - assert(!f0.valid()); - assert(!f.valid()); + std::future<int> f0, f; + f = f0; // expected-error {{'operator=' is a private member of 'std::__1::future<int>'}} } { - typedef void T; - std::promise<T> p; - std::future<T> f0 = p.get_future(); - std::future<T> f; - f = f0; - assert(!f0.valid()); - assert(f.valid()); + std::future<int &> f0, f; + f = f0; // expected-error {{'operator=' is a private member of 'std::__1::future<int &>'}} } { - typedef void T; - std::future<T> f0; - std::future<T> f; - f = f0; - assert(!f0.valid()); - assert(!f.valid()); + std::future<void> f0, f; + f = f0; // expected-error {{'operator=' is a private member of 'std::__1::future<void>'}} } -#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES +#endif } diff --git a/test/std/thread/futures/futures.unique_future/copy_ctor.fail.cpp b/test/std/thread/futures/futures.unique_future/copy_ctor.fail.cpp index 8d43294ed..0d7b5f507 100644 --- a/test/std/thread/futures/futures.unique_future/copy_ctor.fail.cpp +++ b/test/std/thread/futures/futures.unique_future/copy_ctor.fail.cpp @@ -14,53 +14,36 @@ // future(const future&) = delete; #include <future> -#include <cassert> + +#include "test_macros.h" int main() { +#if TEST_STD_VER >= 11 { - typedef int T; - std::promise<T> p; - std::future<T> f0 = p.get_future(); - std::future<T> f = f0; - assert(!f0.valid()); - assert(f.valid()); + std::future<int> f0; + std::future<int> f = f0; // expected-error {{call to deleted constructor of 'std::future<int>'}} } { - typedef int T; - std::future<T> f0; - std::future<T> f = f0; - assert(!f0.valid()); - assert(!f.valid()); + std::future<int &> f0; + std::future<int &> f = f0; // expected-error {{call to deleted constructor of 'std::future<int &>'}} } { - typedef int& T; - std::promise<T> p; - std::future<T> f0 = p.get_future(); - std::future<T> f = f0; - assert(!f0.valid()); - assert(f.valid()); + std::future<void> f0; + std::future<void> f = f0; // expected-error {{call to deleted constructor of 'std::future<void>'}} } +#else { - typedef int& T; - std::future<T> f0; - std::future<T> f = std::move(f0); - assert(!f0.valid()); - assert(!f.valid()); + std::future<int> f0; + std::future<int> f = f0; // expected-error {{calling a private constructor of class 'std::__1::future<int>'}} } { - typedef void T; - std::promise<T> p; - std::future<T> f0 = p.get_future(); - std::future<T> f = f0; - assert(!f0.valid()); - assert(f.valid()); + std::future<int &> f0; + std::future<int &> f = f0; // expected-error {{calling a private constructor of class 'std::__1::future<int &>'}} } { - typedef void T; - std::future<T> f0; - std::future<T> f = f0; - assert(!f0.valid()); - assert(!f.valid()); + std::future<void> f0; + std::future<void> f = f0; // expected-error {{calling a private constructor of class 'std::__1::future<void>'}} } +#endif } diff --git a/test/std/thread/futures/futures.unique_future/dtor.pass.cpp b/test/std/thread/futures/futures.unique_future/dtor.pass.cpp index 5e9697bb9..e085ff8a2 100644 --- a/test/std/thread/futures/futures.unique_future/dtor.pass.cpp +++ b/test/std/thread/futures/futures.unique_future/dtor.pass.cpp @@ -8,6 +8,7 @@ //===----------------------------------------------------------------------===// // // UNSUPPORTED: libcpp-has-no-threads +// UNSUPPORTED: c++98, c++03 // <future> @@ -18,51 +19,51 @@ #include <future> #include <cassert> -#include "../test_allocator.h" +#include "test_allocator.h" int main() { - assert(test_alloc_base::count == 0); + assert(test_alloc_base::alloc_count == 0); { typedef int T; std::future<T> f; { std::promise<T> p(std::allocator_arg, test_allocator<T>()); - assert(test_alloc_base::count == 1); + assert(test_alloc_base::alloc_count == 1); f = p.get_future(); - assert(test_alloc_base::count == 1); + assert(test_alloc_base::alloc_count == 1); assert(f.valid()); } - assert(test_alloc_base::count == 1); + assert(test_alloc_base::alloc_count == 1); assert(f.valid()); } - assert(test_alloc_base::count == 0); + assert(test_alloc_base::alloc_count == 0); { typedef int& T; std::future<T> f; { std::promise<T> p(std::allocator_arg, test_allocator<int>()); - assert(test_alloc_base::count == 1); + assert(test_alloc_base::alloc_count == 1); f = p.get_future(); - assert(test_alloc_base::count == 1); + assert(test_alloc_base::alloc_count == 1); assert(f.valid()); } - assert(test_alloc_base::count == 1); + assert(test_alloc_base::alloc_count == 1); assert(f.valid()); } - assert(test_alloc_base::count == 0); + assert(test_alloc_base::alloc_count == 0); { typedef void T; std::future<T> f; { std::promise<T> p(std::allocator_arg, test_allocator<T>()); - assert(test_alloc_base::count == 1); + assert(test_alloc_base::alloc_count == 1); f = p.get_future(); - assert(test_alloc_base::count == 1); + assert(test_alloc_base::alloc_count == 1); assert(f.valid()); } - assert(test_alloc_base::count == 1); + assert(test_alloc_base::alloc_count == 1); assert(f.valid()); } - assert(test_alloc_base::count == 0); + assert(test_alloc_base::alloc_count == 0); } diff --git a/test/std/thread/futures/futures.unique_future/get.pass.cpp b/test/std/thread/futures/futures.unique_future/get.pass.cpp index 758e38a7d..6029a5f46 100644 --- a/test/std/thread/futures/futures.unique_future/get.pass.cpp +++ b/test/std/thread/futures/futures.unique_future/get.pass.cpp @@ -8,6 +8,7 @@ //===----------------------------------------------------------------------===// // // UNSUPPORTED: libcpp-has-no-threads +// UNSUPPORTED: c++98, c++03 // <future> diff --git a/test/std/thread/futures/futures.unique_future/share.pass.cpp b/test/std/thread/futures/futures.unique_future/share.pass.cpp index 794b5ce38..ef011d8df 100644 --- a/test/std/thread/futures/futures.unique_future/share.pass.cpp +++ b/test/std/thread/futures/futures.unique_future/share.pass.cpp @@ -8,6 +8,7 @@ //===----------------------------------------------------------------------===// // // UNSUPPORTED: libcpp-has-no-threads +// UNSUPPORTED: c++98, c++03 // <future> diff --git a/test/std/thread/futures/futures.unique_future/wait.pass.cpp b/test/std/thread/futures/futures.unique_future/wait.pass.cpp index e10d37cf8..f6de983f3 100644 --- a/test/std/thread/futures/futures.unique_future/wait.pass.cpp +++ b/test/std/thread/futures/futures.unique_future/wait.pass.cpp @@ -8,6 +8,7 @@ //===----------------------------------------------------------------------===// // // UNSUPPORTED: libcpp-has-no-threads +// UNSUPPORTED: c++98, c++03 // <future> diff --git a/test/std/thread/futures/futures.unique_future/wait_for.pass.cpp b/test/std/thread/futures/futures.unique_future/wait_for.pass.cpp index 0a381d9ca..c4f358268 100644 --- a/test/std/thread/futures/futures.unique_future/wait_for.pass.cpp +++ b/test/std/thread/futures/futures.unique_future/wait_for.pass.cpp @@ -8,6 +8,7 @@ //===----------------------------------------------------------------------===// // // UNSUPPORTED: libcpp-has-no-threads +// UNSUPPORTED: c++98, c++03 // <future> diff --git a/test/std/thread/futures/futures.unique_future/wait_until.pass.cpp b/test/std/thread/futures/futures.unique_future/wait_until.pass.cpp index d5865b9b9..541c00860 100644 --- a/test/std/thread/futures/futures.unique_future/wait_until.pass.cpp +++ b/test/std/thread/futures/futures.unique_future/wait_until.pass.cpp @@ -1,129 +1,130 @@ - //===----------------------------------------------------------------------===// - // - // The LLVM Compiler Infrastructure - // - // This file is dual licensed under the MIT and the University of Illinois Open - // Source Licenses. See LICENSE.TXT for details. - // - //===----------------------------------------------------------------------===// - // - // UNSUPPORTED: libcpp-has-no-threads - - // <future> - - // class future<R> - - // template <class Clock, class Duration> - // future_status - // wait_until(const chrono::time_point<Clock, Duration>& abs_time) const; - - #include <future> - #include <atomic> - #include <cassert> - - enum class WorkerThreadState { Uninitialized, AllowedToRun, Exiting }; - typedef std::chrono::milliseconds ms; - - std::atomic<WorkerThreadState> thread_state(WorkerThreadState::Uninitialized); - - void set_worker_thread_state(WorkerThreadState state) - { - thread_state.store(state, std::memory_order_relaxed); - } - - void wait_for_worker_thread_state(WorkerThreadState state) - { - while (thread_state.load(std::memory_order_relaxed) != state); - } - - void func1(std::promise<int> p) - { - wait_for_worker_thread_state(WorkerThreadState::AllowedToRun); - p.set_value(3); - set_worker_thread_state(WorkerThreadState::Exiting); - } - - int j = 0; - - void func3(std::promise<int&> p) - { - wait_for_worker_thread_state(WorkerThreadState::AllowedToRun); - j = 5; - p.set_value(j); - set_worker_thread_state(WorkerThreadState::Exiting); - } - - void func5(std::promise<void> p) - { - wait_for_worker_thread_state(WorkerThreadState::AllowedToRun); - p.set_value(); - set_worker_thread_state(WorkerThreadState::Exiting); - } - - int main() - { - typedef std::chrono::high_resolution_clock Clock; - { - typedef int T; - std::promise<T> p; - std::future<T> f = p.get_future(); - std::thread(func1, std::move(p)).detach(); - assert(f.valid()); - assert(f.wait_until(Clock::now() + ms(10)) == std::future_status::timeout); - assert(f.valid()); - - // allow the worker thread to produce the result and wait until the worker is done - set_worker_thread_state(WorkerThreadState::AllowedToRun); - wait_for_worker_thread_state(WorkerThreadState::Exiting); - - assert(f.wait_until(Clock::now() + ms(10)) == std::future_status::ready); - assert(f.valid()); - Clock::time_point t0 = Clock::now(); - f.wait(); - Clock::time_point t1 = Clock::now(); - assert(f.valid()); - assert(t1-t0 < ms(5)); - } - { - typedef int& T; - std::promise<T> p; - std::future<T> f = p.get_future(); - std::thread(func3, std::move(p)).detach(); - assert(f.valid()); - assert(f.wait_until(Clock::now() + ms(10)) == std::future_status::timeout); - assert(f.valid()); - - // allow the worker thread to produce the result and wait until the worker is done - set_worker_thread_state(WorkerThreadState::AllowedToRun); - wait_for_worker_thread_state(WorkerThreadState::Exiting); - - assert(f.wait_until(Clock::now() + ms(10)) == std::future_status::ready); - assert(f.valid()); - Clock::time_point t0 = Clock::now(); - f.wait(); - Clock::time_point t1 = Clock::now(); - assert(f.valid()); - assert(t1-t0 < ms(5)); - } - { - typedef void T; - std::promise<T> p; - std::future<T> f = p.get_future(); - std::thread(func5, std::move(p)).detach(); - assert(f.valid()); - assert(f.wait_until(Clock::now() + ms(10)) == std::future_status::timeout); - assert(f.valid()); - - // allow the worker thread to produce the result and wait until the worker is done - set_worker_thread_state(WorkerThreadState::AllowedToRun); - wait_for_worker_thread_state(WorkerThreadState::Exiting); - - assert(f.wait_until(Clock::now() + ms(10)) == std::future_status::ready); - assert(f.valid()); - Clock::time_point t0 = Clock::now(); - f.wait(); - Clock::time_point t1 = Clock::now(); - assert(f.valid()); - assert(t1-t0 < ms(5)); - } - } +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// UNSUPPORTED: libcpp-has-no-threads +// UNSUPPORTED: c++98, c++03 + +// <future> + +// class future<R> + +// template <class Clock, class Duration> +// future_status +// wait_until(const chrono::time_point<Clock, Duration>& abs_time) const; + +#include <future> +#include <atomic> +#include <cassert> + +enum class WorkerThreadState { Uninitialized, AllowedToRun, Exiting }; +typedef std::chrono::milliseconds ms; + +std::atomic<WorkerThreadState> thread_state(WorkerThreadState::Uninitialized); + +void set_worker_thread_state(WorkerThreadState state) +{ + thread_state.store(state, std::memory_order_relaxed); +} + +void wait_for_worker_thread_state(WorkerThreadState state) +{ + while (thread_state.load(std::memory_order_relaxed) != state); +} + +void func1(std::promise<int> p) +{ + wait_for_worker_thread_state(WorkerThreadState::AllowedToRun); + p.set_value(3); + set_worker_thread_state(WorkerThreadState::Exiting); +} + +int j = 0; + +void func3(std::promise<int&> p) +{ + wait_for_worker_thread_state(WorkerThreadState::AllowedToRun); + j = 5; + p.set_value(j); + set_worker_thread_state(WorkerThreadState::Exiting); +} + +void func5(std::promise<void> p) +{ + wait_for_worker_thread_state(WorkerThreadState::AllowedToRun); + p.set_value(); + set_worker_thread_state(WorkerThreadState::Exiting); +} + +int main() +{ + typedef std::chrono::high_resolution_clock Clock; + { + typedef int T; + std::promise<T> p; + std::future<T> f = p.get_future(); + std::thread(func1, std::move(p)).detach(); + assert(f.valid()); + assert(f.wait_until(Clock::now() + ms(10)) == std::future_status::timeout); + assert(f.valid()); + + // allow the worker thread to produce the result and wait until the worker is done + set_worker_thread_state(WorkerThreadState::AllowedToRun); + wait_for_worker_thread_state(WorkerThreadState::Exiting); + + assert(f.wait_until(Clock::now() + ms(10)) == std::future_status::ready); + assert(f.valid()); + Clock::time_point t0 = Clock::now(); + f.wait(); + Clock::time_point t1 = Clock::now(); + assert(f.valid()); + assert(t1-t0 < ms(5)); + } + { + typedef int& T; + std::promise<T> p; + std::future<T> f = p.get_future(); + std::thread(func3, std::move(p)).detach(); + assert(f.valid()); + assert(f.wait_until(Clock::now() + ms(10)) == std::future_status::timeout); + assert(f.valid()); + + // allow the worker thread to produce the result and wait until the worker is done + set_worker_thread_state(WorkerThreadState::AllowedToRun); + wait_for_worker_thread_state(WorkerThreadState::Exiting); + + assert(f.wait_until(Clock::now() + ms(10)) == std::future_status::ready); + assert(f.valid()); + Clock::time_point t0 = Clock::now(); + f.wait(); + Clock::time_point t1 = Clock::now(); + assert(f.valid()); + assert(t1-t0 < ms(5)); + } + { + typedef void T; + std::promise<T> p; + std::future<T> f = p.get_future(); + std::thread(func5, std::move(p)).detach(); + assert(f.valid()); + assert(f.wait_until(Clock::now() + ms(10)) == std::future_status::timeout); + assert(f.valid()); + + // allow the worker thread to produce the result and wait until the worker is done + set_worker_thread_state(WorkerThreadState::AllowedToRun); + wait_for_worker_thread_state(WorkerThreadState::Exiting); + + assert(f.wait_until(Clock::now() + ms(10)) == std::future_status::ready); + assert(f.valid()); + Clock::time_point t0 = Clock::now(); + f.wait(); + Clock::time_point t1 = Clock::now(); + assert(f.valid()); + assert(t1-t0 < ms(5)); + } +} diff --git a/test/std/thread/futures/test_allocator.h b/test/std/thread/futures/test_allocator.h deleted file mode 100644 index 50072909f..000000000 --- a/test/std/thread/futures/test_allocator.h +++ /dev/null @@ -1,158 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// - -#ifndef TEST_ALLOCATOR_H -#define TEST_ALLOCATOR_H - -#include <cstddef> -#include <type_traits> -#include <utility> -#include <cstdlib> -#include <new> -#include <climits> - -class test_alloc_base -{ -public: - static int count; -public: - static int throw_after; -}; - -int test_alloc_base::count = 0; -int test_alloc_base::throw_after = INT_MAX; - -template <class T> -class test_allocator - : public test_alloc_base -{ - int data_; - - template <class U> friend class test_allocator; -public: - - typedef unsigned size_type; - typedef int difference_type; - typedef T value_type; - typedef value_type* pointer; - typedef const value_type* const_pointer; - typedef typename std::add_lvalue_reference<value_type>::type reference; - typedef typename std::add_lvalue_reference<const value_type>::type const_reference; - - template <class U> struct rebind {typedef test_allocator<U> other;}; - - test_allocator() throw() : data_(-1) {} - explicit test_allocator(int i) throw() : data_(i) {} - test_allocator(const test_allocator& a) throw() - : data_(a.data_) {} - template <class U> test_allocator(const test_allocator<U>& a) throw() - : data_(a.data_) {} - ~test_allocator() throw() {data_ = 0;} - pointer address(reference x) const {return &x;} - const_pointer address(const_reference x) const {return &x;} - pointer allocate(size_type n, const void* = 0) - { - if (count >= throw_after) { -#ifndef _LIBCPP_NO_EXCEPTIONS - throw std::bad_alloc(); -#else - std::terminate(); -#endif - } - ++count; - return (pointer)std::malloc(n * sizeof(T)); - } - void deallocate(pointer p, size_type n) - {--count; std::free(p);} - size_type max_size() const throw() - {return UINT_MAX / sizeof(T);} - void construct(pointer p, const T& val) - {::new(p) T(val);} -#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES - void construct(pointer p, T&& val) - {::new(p) T(std::move(val));} -#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES - void destroy(pointer p) {p->~T();} - - friend bool operator==(const test_allocator& x, const test_allocator& y) - {return x.data_ == y.data_;} - friend bool operator!=(const test_allocator& x, const test_allocator& y) - {return !(x == y);} -}; - -template <> -class test_allocator<void> - : public test_alloc_base -{ - int data_; - - template <class U> friend class test_allocator; -public: - - typedef unsigned size_type; - typedef int difference_type; - typedef void value_type; - typedef value_type* pointer; - typedef const value_type* const_pointer; - - template <class U> struct rebind {typedef test_allocator<U> other;}; - - test_allocator() throw() : data_(-1) {} - explicit test_allocator(int i) throw() : data_(i) {} - test_allocator(const test_allocator& a) throw() - : data_(a.data_) {} - template <class U> test_allocator(const test_allocator<U>& a) throw() - : data_(a.data_) {} - ~test_allocator() throw() {data_ = 0;} - - friend bool operator==(const test_allocator& x, const test_allocator& y) - {return x.data_ == y.data_;} - friend bool operator!=(const test_allocator& x, const test_allocator& y) - {return !(x == y);} -}; - -template <class T> -class other_allocator -{ - int data_; - - template <class U> friend class other_allocator; - -public: - typedef T value_type; - - other_allocator() : data_(-1) {} - explicit other_allocator(int i) : data_(i) {} - template <class U> other_allocator(const other_allocator<U>& a) - : data_(a.data_) {} - T* allocate(std::size_t n) - {return (T*)std::malloc(n * sizeof(T));} - void deallocate(T* p, std::size_t n) - {std::free(p);} - - other_allocator select_on_container_copy_construction() const - {return other_allocator(-2);} - - friend bool operator==(const other_allocator& x, const other_allocator& y) - {return x.data_ == y.data_;} - friend bool operator!=(const other_allocator& x, const other_allocator& y) - {return !(x == y);} - - typedef std::true_type propagate_on_container_copy_assignment; - typedef std::true_type propagate_on_container_move_assignment; - typedef std::true_type propagate_on_container_swap; - -#ifdef _LIBCPP_HAS_NO_ADVANCED_SFINAE - std::size_t max_size() const - {return UINT_MAX / sizeof(T);} -#endif // _LIBCPP_HAS_NO_ADVANCED_SFINAE - -}; - -#endif // TEST_ALLOCATOR_H diff --git a/test/std/thread/futures/version.pass.cpp b/test/std/thread/futures/version.pass.cpp index 6730a1477..e69de29bb 100644 --- a/test/std/thread/futures/version.pass.cpp +++ b/test/std/thread/futures/version.pass.cpp @@ -1,22 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// UNSUPPORTED: libcpp-has-no-threads - -// <future> - -#include <future> - -#ifndef _LIBCPP_VERSION -#error _LIBCPP_VERSION not defined -#endif - -int main() -{ -} |