Index: test/libcxx/thread/futures/version.pass.cpp =================================================================== --- /dev/null +++ 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 + +// + +#include + +#ifndef _LIBCPP_VERSION +#error _LIBCPP_VERSION not defined +#endif + +int main() +{ +} Index: test/std/thread/futures/futures.promise/alloc_ctor.pass.cpp =================================================================== --- test/std/thread/futures/futures.promise/alloc_ctor.pass.cpp +++ test/std/thread/futures/futures.promise/alloc_ctor.pass.cpp @@ -8,6 +8,7 @@ //===----------------------------------------------------------------------===// // // UNSUPPORTED: libcpp-has-no-threads +// UNSUPPORTED: c++98, c++03 // @@ -19,36 +20,36 @@ #include #include -#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 p(std::allocator_arg, test_allocator()); - assert(test_alloc_base::count == 1); + std::promise p(std::allocator_arg, test_allocator(42)); + assert(test_alloc_base::alloc_count == 1); std::future 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 p(std::allocator_arg, test_allocator()); - assert(test_alloc_base::count == 1); + std::promise p(std::allocator_arg, test_allocator(42)); + assert(test_alloc_base::alloc_count == 1); std::future 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 p(std::allocator_arg, test_allocator()); - assert(test_alloc_base::count == 1); + std::promise p(std::allocator_arg, test_allocator(42)); + assert(test_alloc_base::alloc_count == 1); std::future 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 p(std::allocator_arg, bare_allocator()); Index: test/std/thread/futures/futures.promise/copy_assign.fail.cpp =================================================================== --- test/std/thread/futures/futures.promise/copy_assign.fail.cpp +++ test/std/thread/futures/futures.promise/copy_assign.fail.cpp @@ -14,74 +14,36 @@ // promise& operator=(const promise& rhs) = delete; #include -#include -#include "../test_allocator.h" +#include "test_macros.h" int main() { - assert(test_alloc_base::count == 0); +#if TEST_STD_VER >= 11 { - std::promise p0(std::allocator_arg, test_allocator()); - std::promise p(std::allocator_arg, test_allocator()); - assert(test_alloc_base::count == 2); - p = p0; - assert(test_alloc_base::count == 1); - std::future 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 p0, p; + p = p0; // expected-error {{overload resolution selected deleted operator '='}} } - assert(test_alloc_base::count == 0); { - std::promise p0(std::allocator_arg, test_allocator()); - std::promise p(std::allocator_arg, test_allocator()); - assert(test_alloc_base::count == 2); - p = p0; - assert(test_alloc_base::count == 1); - std::future 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 p0, p; + p = p0; // expected-error {{overload resolution selected deleted operator '='}} } - assert(test_alloc_base::count == 0); { - std::promise p0(std::allocator_arg, test_allocator()); - std::promise p(std::allocator_arg, test_allocator()); - assert(test_alloc_base::count == 2); - p = p0; - assert(test_alloc_base::count == 1); - std::future 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 p0, p; + p = p0; // expected-error {{overload resolution selected deleted operator '='}} } - assert(test_alloc_base::count == 0); +#else + { + std::promise p0, p; + p = p0; // expected-error {{'operator=' is a private member of 'std::__1::promise'}} + } + { + std::promise p0, p; + p = p0; // expected-error {{'operator=' is a private member of 'std::__1::promise'}} + } + { + std::promise p0, p; + p = p0; // expected-error {{'operator=' is a private member of 'std::__1::promise'}} + } +#endif } Index: test/std/thread/futures/futures.promise/copy_ctor.fail.cpp =================================================================== --- test/std/thread/futures/futures.promise/copy_ctor.fail.cpp +++ test/std/thread/futures/futures.promise/copy_ctor.fail.cpp @@ -14,68 +14,36 @@ // promise(const promise&) = delete; #include -#include -#include "../test_allocator.h" +#include "test_macros.h" int main() { - assert(test_alloc_base::count == 0); +#if TEST_STD_VER >= 11 { - std::promise p0(std::allocator_arg, test_allocator()); - std::promise p(p0); - assert(test_alloc_base::count == 1); - std::future 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 p0; + std::promise p(p0); // expected-error {{call to deleted constructor of 'std::promise'}} } - assert(test_alloc_base::count == 0); { - std::promise p0(std::allocator_arg, test_allocator()); - std::promise p(p0); - assert(test_alloc_base::count == 1); - std::future 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 p0; + std::promise p(p0); // expected-error {{call to deleted constructor of 'std::promise'}} } - assert(test_alloc_base::count == 0); { - std::promise p0(std::allocator_arg, test_allocator()); - std::promise p(p0); - assert(test_alloc_base::count == 1); - std::future 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 p0; + std::promise p(p0); // expected-error {{call to deleted constructor of 'std::promise'}} } - assert(test_alloc_base::count == 0); +#else + { + std::promise p0; + std::promise p(p0); // expected-error {{calling a private constructor of class 'std::__1::promise'}} + } + { + std::promise p0; + std::promise p(p0); // expected-error {{calling a private constructor of class 'std::__1::promise'}} + } + { + std::promise p0; + std::promise p(p0); // expected-error {{calling a private constructor of class 'std::__1::promise'}} + } +#endif } Index: test/std/thread/futures/futures.promise/default.pass.cpp =================================================================== --- test/std/thread/futures/futures.promise/default.pass.cpp +++ test/std/thread/futures/futures.promise/default.pass.cpp @@ -8,6 +8,7 @@ //===----------------------------------------------------------------------===// // // UNSUPPORTED: libcpp-has-no-threads +// UNSUPPORTED: c++98, c++03 // Index: test/std/thread/futures/futures.promise/dtor.pass.cpp =================================================================== --- test/std/thread/futures/futures.promise/dtor.pass.cpp +++ test/std/thread/futures/futures.promise/dtor.pass.cpp @@ -8,6 +8,7 @@ //===----------------------------------------------------------------------===// // // UNSUPPORTED: libcpp-has-no-threads +// UNSUPPORTED: c++98, c++03 // Index: test/std/thread/futures/futures.promise/get_future.pass.cpp =================================================================== --- test/std/thread/futures/futures.promise/get_future.pass.cpp +++ test/std/thread/futures/futures.promise/get_future.pass.cpp @@ -8,6 +8,7 @@ //===----------------------------------------------------------------------===// // // UNSUPPORTED: libcpp-has-no-threads +// UNSUPPORTED: c++98, c++03 // Index: test/std/thread/futures/futures.promise/move_assign.pass.cpp =================================================================== --- test/std/thread/futures/futures.promise/move_assign.pass.cpp +++ test/std/thread/futures/futures.promise/move_assign.pass.cpp @@ -8,6 +8,7 @@ //===----------------------------------------------------------------------===// // // UNSUPPORTED: libcpp-has-no-threads +// UNSUPPORTED: c++98, c++03 // @@ -18,20 +19,19 @@ #include #include -#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 p0(std::allocator_arg, test_allocator()); std::promise p(std::allocator_arg, test_allocator()); - 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 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 @@ { 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 p0(std::allocator_arg, test_allocator()); std::promise p(std::allocator_arg, test_allocator()); - 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 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 @@ { 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 p0(std::allocator_arg, test_allocator()); std::promise p(std::allocator_arg, test_allocator()); - 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 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 @@ { 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); } Index: test/std/thread/futures/futures.promise/move_ctor.pass.cpp =================================================================== --- test/std/thread/futures/futures.promise/move_ctor.pass.cpp +++ test/std/thread/futures/futures.promise/move_ctor.pass.cpp @@ -8,6 +8,7 @@ //===----------------------------------------------------------------------===// // // UNSUPPORTED: libcpp-has-no-threads +// UNSUPPORTED: c++98, c++03 // @@ -18,18 +19,17 @@ #include #include -#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 p0(std::allocator_arg, test_allocator()); std::promise p(std::move(p0)); - assert(test_alloc_base::count == 1); + assert(test_alloc_base::alloc_count == 1); std::future 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 @@ { 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 p0(std::allocator_arg, test_allocator()); std::promise p(std::move(p0)); - assert(test_alloc_base::count == 1); + assert(test_alloc_base::alloc_count == 1); std::future 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 @@ { 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 p0(std::allocator_arg, test_allocator()); std::promise p(std::move(p0)); - assert(test_alloc_base::count == 1); + assert(test_alloc_base::alloc_count == 1); std::future 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 @@ { 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); } Index: test/std/thread/futures/futures.promise/set_exception.pass.cpp =================================================================== --- test/std/thread/futures/futures.promise/set_exception.pass.cpp +++ test/std/thread/futures/futures.promise/set_exception.pass.cpp @@ -8,6 +8,7 @@ //===----------------------------------------------------------------------===// // // UNSUPPORTED: libcpp-has-no-threads +// UNSUPPORTED: c++98, c++03 // Index: test/std/thread/futures/futures.promise/set_exception_at_thread_exit.pass.cpp =================================================================== --- test/std/thread/futures/futures.promise/set_exception_at_thread_exit.pass.cpp +++ 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 // Index: test/std/thread/futures/futures.promise/set_lvalue.pass.cpp =================================================================== --- test/std/thread/futures/futures.promise/set_lvalue.pass.cpp +++ test/std/thread/futures/futures.promise/set_lvalue.pass.cpp @@ -8,6 +8,7 @@ //===----------------------------------------------------------------------===// // // UNSUPPORTED: libcpp-has-no-threads +// UNSUPPORTED: c++98, c++03 // Index: test/std/thread/futures/futures.promise/set_lvalue_at_thread_exit.pass.cpp =================================================================== --- test/std/thread/futures/futures.promise/set_lvalue_at_thread_exit.pass.cpp +++ 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 // Index: test/std/thread/futures/futures.promise/set_value_at_thread_exit_const.pass.cpp =================================================================== --- test/std/thread/futures/futures.promise/set_value_at_thread_exit_const.pass.cpp +++ 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 // Index: test/std/thread/futures/futures.promise/set_value_at_thread_exit_void.pass.cpp =================================================================== --- test/std/thread/futures/futures.promise/set_value_at_thread_exit_void.pass.cpp +++ 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 // Index: test/std/thread/futures/futures.promise/set_value_const.pass.cpp =================================================================== --- test/std/thread/futures/futures.promise/set_value_const.pass.cpp +++ 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 // Index: test/std/thread/futures/futures.promise/set_value_void.pass.cpp =================================================================== --- test/std/thread/futures/futures.promise/set_value_void.pass.cpp +++ 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 // Index: test/std/thread/futures/futures.promise/swap.pass.cpp =================================================================== --- test/std/thread/futures/futures.promise/swap.pass.cpp +++ test/std/thread/futures/futures.promise/swap.pass.cpp @@ -8,6 +8,7 @@ //===----------------------------------------------------------------------===// // // UNSUPPORTED: libcpp-has-no-threads +// UNSUPPORTED: c++98, c++03 // @@ -20,65 +21,65 @@ #include #include -#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 p0(std::allocator_arg, test_allocator()); std::promise p(std::allocator_arg, test_allocator()); - 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 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 p0(std::allocator_arg, test_allocator()); std::promise p(std::allocator_arg, test_allocator()); - 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 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 p0(std::allocator_arg, test_allocator()); std::promise 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 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 p0(std::allocator_arg, test_allocator()); std::promise 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 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); } Index: test/std/thread/futures/futures.promise/uses_allocator.pass.cpp =================================================================== --- test/std/thread/futures/futures.promise/uses_allocator.pass.cpp +++ test/std/thread/futures/futures.promise/uses_allocator.pass.cpp @@ -18,7 +18,7 @@ // : true_type { }; #include -#include "../test_allocator.h" +#include "test_allocator.h" int main() { Index: test/std/thread/futures/futures.shared_future/copy_assign.pass.cpp =================================================================== --- test/std/thread/futures/futures.shared_future/copy_assign.pass.cpp +++ 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 // @@ -20,7 +21,6 @@ int main() { -#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES { typedef int T; std::promise p; @@ -72,5 +72,4 @@ assert(!f0.valid()); assert(!f.valid()); } -#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES } Index: test/std/thread/futures/futures.shared_future/copy_ctor.pass.cpp =================================================================== --- test/std/thread/futures/futures.shared_future/copy_ctor.pass.cpp +++ 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 // Index: test/std/thread/futures/futures.shared_future/ctor_future.pass.cpp =================================================================== --- test/std/thread/futures/futures.shared_future/ctor_future.pass.cpp +++ 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 // Index: test/std/thread/futures/futures.shared_future/dtor.pass.cpp =================================================================== --- test/std/thread/futures/futures.shared_future/dtor.pass.cpp +++ test/std/thread/futures/futures.shared_future/dtor.pass.cpp @@ -8,6 +8,7 @@ //===----------------------------------------------------------------------===// // // UNSUPPORTED: libcpp-has-no-threads +// UNSUPPORTED: c++98, c++03 // @@ -18,51 +19,51 @@ #include #include -#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 f; { std::promise p(std::allocator_arg, test_allocator()); - 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 f; { std::promise p(std::allocator_arg, test_allocator()); - 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 f; { std::promise p(std::allocator_arg, test_allocator()); - 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); } Index: test/std/thread/futures/futures.shared_future/get.pass.cpp =================================================================== --- test/std/thread/futures/futures.shared_future/get.pass.cpp +++ test/std/thread/futures/futures.shared_future/get.pass.cpp @@ -8,6 +8,7 @@ //===----------------------------------------------------------------------===// // // UNSUPPORTED: libcpp-has-no-threads +// UNSUPPORTED: c++98, c++03 // Index: test/std/thread/futures/futures.shared_future/move_assign.pass.cpp =================================================================== --- test/std/thread/futures/futures.shared_future/move_assign.pass.cpp +++ 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 // @@ -20,7 +21,6 @@ int main() { -#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES { typedef int T; std::promise p; @@ -72,5 +72,4 @@ assert(!f0.valid()); assert(!f.valid()); } -#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES } Index: test/std/thread/futures/futures.shared_future/move_ctor.pass.cpp =================================================================== --- test/std/thread/futures/futures.shared_future/move_ctor.pass.cpp +++ 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 // Index: test/std/thread/futures/futures.shared_future/wait.pass.cpp =================================================================== --- test/std/thread/futures/futures.shared_future/wait.pass.cpp +++ test/std/thread/futures/futures.shared_future/wait.pass.cpp @@ -8,6 +8,7 @@ //===----------------------------------------------------------------------===// // // UNSUPPORTED: libcpp-has-no-threads +// UNSUPPORTED: c++98, c++03 // Index: test/std/thread/futures/futures.shared_future/wait_for.pass.cpp =================================================================== --- test/std/thread/futures/futures.shared_future/wait_for.pass.cpp +++ 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 // Index: test/std/thread/futures/futures.shared_future/wait_until.pass.cpp =================================================================== --- test/std/thread/futures/futures.shared_future/wait_until.pass.cpp +++ 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 // Index: test/std/thread/futures/futures.unique_future/copy_assign.fail.cpp =================================================================== --- test/std/thread/futures/futures.unique_future/copy_assign.fail.cpp +++ test/std/thread/futures/futures.unique_future/copy_assign.fail.cpp @@ -14,61 +14,36 @@ // future& operator=(const future&) = delete; #include -#include + +#include "test_macros.h" int main() { -#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES +#if TEST_STD_VER >= 11 { - typedef int T; - std::promise p; - std::future f0 = p.get_future(); - std::future f; - f = f0; - assert(!f0.valid()); - assert(f.valid()); + std::future f0, f; + f = f0; // expected-error {{overload resolution selected deleted operator '='}} } { - typedef int T; - std::future f0; - std::future f; - f = f0; - assert(!f0.valid()); - assert(!f.valid()); + std::future f0, f; + f = f0; // expected-error {{overload resolution selected deleted operator '='}} } { - typedef int& T; - std::promise p; - std::future f0 = p.get_future(); - std::future f; - f = f0; - assert(!f0.valid()); - assert(f.valid()); + std::future f0, f; + f = f0; // expected-error {{overload resolution selected deleted operator '='}} } +#else { - typedef int& T; - std::future f0; - std::future f; - f = f0; - assert(!f0.valid()); - assert(!f.valid()); + std::future f0, f; + f = f0; // expected-error {{'operator=' is a private member of 'std::__1::future'}} } { - typedef void T; - std::promise p; - std::future f0 = p.get_future(); - std::future f; - f = f0; - assert(!f0.valid()); - assert(f.valid()); + std::future f0, f; + f = f0; // expected-error {{'operator=' is a private member of 'std::__1::future'}} } { - typedef void T; - std::future f0; - std::future f; - f = f0; - assert(!f0.valid()); - assert(!f.valid()); + std::future f0, f; + f = f0; // expected-error {{'operator=' is a private member of 'std::__1::future'}} } -#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES +#endif } Index: test/std/thread/futures/futures.unique_future/copy_ctor.fail.cpp =================================================================== --- test/std/thread/futures/futures.unique_future/copy_ctor.fail.cpp +++ test/std/thread/futures/futures.unique_future/copy_ctor.fail.cpp @@ -14,53 +14,36 @@ // future(const future&) = delete; #include -#include + +#include "test_macros.h" int main() { +#if TEST_STD_VER >= 11 { - typedef int T; - std::promise p; - std::future f0 = p.get_future(); - std::future f = f0; - assert(!f0.valid()); - assert(f.valid()); + std::future f0; + std::future f = f0; // expected-error {{call to deleted constructor of 'std::future'}} } { - typedef int T; - std::future f0; - std::future f = f0; - assert(!f0.valid()); - assert(!f.valid()); + std::future f0; + std::future f = f0; // expected-error {{call to deleted constructor of 'std::future'}} } { - typedef int& T; - std::promise p; - std::future f0 = p.get_future(); - std::future f = f0; - assert(!f0.valid()); - assert(f.valid()); + std::future f0; + std::future f = f0; // expected-error {{call to deleted constructor of 'std::future'}} } +#else { - typedef int& T; - std::future f0; - std::future f = std::move(f0); - assert(!f0.valid()); - assert(!f.valid()); + std::future f0; + std::future f = f0; // expected-error {{calling a private constructor of class 'std::__1::future'}} } { - typedef void T; - std::promise p; - std::future f0 = p.get_future(); - std::future f = f0; - assert(!f0.valid()); - assert(f.valid()); + std::future f0; + std::future f = f0; // expected-error {{calling a private constructor of class 'std::__1::future'}} } { - typedef void T; - std::future f0; - std::future f = f0; - assert(!f0.valid()); - assert(!f.valid()); + std::future f0; + std::future f = f0; // expected-error {{calling a private constructor of class 'std::__1::future'}} } +#endif } Index: test/std/thread/futures/futures.unique_future/dtor.pass.cpp =================================================================== --- test/std/thread/futures/futures.unique_future/dtor.pass.cpp +++ test/std/thread/futures/futures.unique_future/dtor.pass.cpp @@ -8,6 +8,7 @@ //===----------------------------------------------------------------------===// // // UNSUPPORTED: libcpp-has-no-threads +// UNSUPPORTED: c++98, c++03 // @@ -18,51 +19,51 @@ #include #include -#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 f; { std::promise p(std::allocator_arg, test_allocator()); - 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 f; { std::promise p(std::allocator_arg, test_allocator()); - 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 f; { std::promise p(std::allocator_arg, test_allocator()); - 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); } Index: test/std/thread/futures/futures.unique_future/get.pass.cpp =================================================================== --- test/std/thread/futures/futures.unique_future/get.pass.cpp +++ test/std/thread/futures/futures.unique_future/get.pass.cpp @@ -8,6 +8,7 @@ //===----------------------------------------------------------------------===// // // UNSUPPORTED: libcpp-has-no-threads +// UNSUPPORTED: c++98, c++03 // Index: test/std/thread/futures/futures.unique_future/share.pass.cpp =================================================================== --- test/std/thread/futures/futures.unique_future/share.pass.cpp +++ test/std/thread/futures/futures.unique_future/share.pass.cpp @@ -8,6 +8,7 @@ //===----------------------------------------------------------------------===// // // UNSUPPORTED: libcpp-has-no-threads +// UNSUPPORTED: c++98, c++03 // Index: test/std/thread/futures/futures.unique_future/wait.pass.cpp =================================================================== --- test/std/thread/futures/futures.unique_future/wait.pass.cpp +++ test/std/thread/futures/futures.unique_future/wait.pass.cpp @@ -8,6 +8,7 @@ //===----------------------------------------------------------------------===// // // UNSUPPORTED: libcpp-has-no-threads +// UNSUPPORTED: c++98, c++03 // Index: test/std/thread/futures/futures.unique_future/wait_for.pass.cpp =================================================================== --- test/std/thread/futures/futures.unique_future/wait_for.pass.cpp +++ 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 // Index: test/std/thread/futures/futures.unique_future/wait_until.pass.cpp =================================================================== --- test/std/thread/futures/futures.unique_future/wait_until.pass.cpp +++ 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 - - // - - // class future - - // template - // future_status - // wait_until(const chrono::time_point& abs_time) const; - - #include - #include - #include - - enum class WorkerThreadState { Uninitialized, AllowedToRun, Exiting }; - typedef std::chrono::milliseconds ms; - - std::atomic 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 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 p) - { - wait_for_worker_thread_state(WorkerThreadState::AllowedToRun); - j = 5; - p.set_value(j); - set_worker_thread_state(WorkerThreadState::Exiting); - } - - void func5(std::promise 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 p; - std::future 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 p; - std::future 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 p; - std::future 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 + +// + +// class future + +// template +// future_status +// wait_until(const chrono::time_point& abs_time) const; + +#include +#include +#include + +enum class WorkerThreadState { Uninitialized, AllowedToRun, Exiting }; +typedef std::chrono::milliseconds ms; + +std::atomic 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 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 p) +{ + wait_for_worker_thread_state(WorkerThreadState::AllowedToRun); + j = 5; + p.set_value(j); + set_worker_thread_state(WorkerThreadState::Exiting); +} + +void func5(std::promise 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 p; + std::future 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 p; + std::future 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 p; + std::future 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)); + } +} Index: test/std/thread/futures/test_allocator.h =================================================================== --- test/std/thread/futures/test_allocator.h +++ test/std/thread/futures/test_allocator.h @@ -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 -#include -#include -#include -#include -#include - -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 test_allocator - : public test_alloc_base -{ - int data_; - - template 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::type reference; - typedef typename std::add_lvalue_reference::type const_reference; - - template struct rebind {typedef test_allocator 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 test_allocator(const test_allocator& 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 - : public test_alloc_base -{ - int data_; - - template 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 struct rebind {typedef test_allocator 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 test_allocator(const test_allocator& 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 other_allocator -{ - int data_; - - template friend class other_allocator; - -public: - typedef T value_type; - - other_allocator() : data_(-1) {} - explicit other_allocator(int i) : data_(i) {} - template other_allocator(const other_allocator& 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 Index: test/std/thread/futures/version.pass.cpp =================================================================== --- test/std/thread/futures/version.pass.cpp +++ 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 - -// - -#include - -#ifndef _LIBCPP_VERSION -#error _LIBCPP_VERSION not defined -#endif - -int main() -{ -}