diff options
author | Eric Fiselier <eric@efcs.ca> | 2014-12-20 01:40:03 +0000 |
---|---|---|
committer | Eric Fiselier <eric@efcs.ca> | 2014-12-20 01:40:03 +0000 |
commit | 5a83710e371fe68a06e6e3876c6a2c8b820a8976 (patch) | |
tree | afde4c82ad6704681781c5cd49baa3fbd05c85db /libcxx/test/std/thread/thread.threads/thread.thread.class/thread.thread.constr | |
parent | f11e8eab527fba316c64112f6e05de1a79693a3e (diff) | |
download | bcm5719-llvm-5a83710e371fe68a06e6e3876c6a2c8b820a8976.tar.gz bcm5719-llvm-5a83710e371fe68a06e6e3876c6a2c8b820a8976.zip |
Move test into test/std subdirectory.
llvm-svn: 224658
Diffstat (limited to 'libcxx/test/std/thread/thread.threads/thread.thread.class/thread.thread.constr')
5 files changed, 341 insertions, 0 deletions
diff --git a/libcxx/test/std/thread/thread.threads/thread.thread.class/thread.thread.constr/F.pass.cpp b/libcxx/test/std/thread/thread.threads/thread.thread.class/thread.thread.constr/F.pass.cpp new file mode 100644 index 00000000000..0f5d5aa4082 --- /dev/null +++ b/libcxx/test/std/thread/thread.threads/thread.thread.class/thread.thread.constr/F.pass.cpp @@ -0,0 +1,154 @@ +//===----------------------------------------------------------------------===// +// +// 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 + +// <thread> + +// class thread + +// template <class F, class ...Args> thread(F&& f, Args&&... args); + +// UNSUPPORTED: asan, msan + +#include <thread> +#include <new> +#include <cstdlib> +#include <cassert> + +unsigned throw_one = 0xFFFF; + +void* operator new(std::size_t s) throw(std::bad_alloc) +{ + if (throw_one == 0) + throw std::bad_alloc(); + --throw_one; + return std::malloc(s); +} + +void operator delete(void* p) throw() +{ + std::free(p); +} + +bool f_run = false; + +void f() +{ + f_run = true; +} + +class G +{ + int alive_; +public: + static int n_alive; + static bool op_run; + + G() : alive_(1) {++n_alive;} + G(const G& g) : alive_(g.alive_) {++n_alive;} + ~G() {alive_ = 0; --n_alive;} + + void operator()() + { + assert(alive_ == 1); + assert(n_alive >= 1); + op_run = true; + } + + void operator()(int i, double j) + { + assert(alive_ == 1); + assert(n_alive >= 1); + assert(i == 5); + assert(j == 5.5); + op_run = true; + } +}; + +int G::n_alive = 0; +bool G::op_run = false; + +#ifndef _LIBCPP_HAS_NO_VARIADICS + +class MoveOnly +{ + MoveOnly(const MoveOnly&); +public: + MoveOnly() {} + MoveOnly(MoveOnly&&) {} + + void operator()(MoveOnly&&) + { + } +}; + +#endif + +int main() +{ + { + std::thread t(f); + t.join(); + assert(f_run == true); + } + f_run = false; + { + try + { + throw_one = 0; + std::thread t(f); + assert(false); + } + catch (...) + { + throw_one = 0xFFFF; + assert(!f_run); + } + } + { + assert(G::n_alive == 0); + assert(!G::op_run); + std::thread t((G())); + t.join(); + assert(G::n_alive == 0); + assert(G::op_run); + } + G::op_run = false; + { + try + { + throw_one = 0; + assert(G::n_alive == 0); + assert(!G::op_run); + std::thread t((G())); + assert(false); + } + catch (...) + { + throw_one = 0xFFFF; + assert(G::n_alive == 0); + assert(!G::op_run); + } + } +#ifndef _LIBCPP_HAS_NO_VARIADICS + { + assert(G::n_alive == 0); + assert(!G::op_run); + std::thread t(G(), 5, 5.5); + t.join(); + assert(G::n_alive == 0); + assert(G::op_run); + } + { + std::thread t = std::thread(MoveOnly(), MoveOnly()); + t.join(); + } +#endif // _LIBCPP_HAS_NO_VARIADICS +} diff --git a/libcxx/test/std/thread/thread.threads/thread.thread.class/thread.thread.constr/constr.fail.cpp b/libcxx/test/std/thread/thread.threads/thread.thread.class/thread.thread.constr/constr.fail.cpp new file mode 100644 index 00000000000..a331add9626 --- /dev/null +++ b/libcxx/test/std/thread/thread.threads/thread.thread.class/thread.thread.constr/constr.fail.cpp @@ -0,0 +1,26 @@ +//===----------------------------------------------------------------------===// +// +// 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. +// +//===----------------------------------------------------------------------===// + +// <thread> + +// class thread +// template <class _Fp, class ..._Args, +// explicit thread(_Fp&& __f, _Args&&... __args); +// This constructor shall not participate in overload resolution +// if decay<F>::type is the same type as std::thread. + + +#include <thread> +#include <cassert> + +int main() +{ + volatile std::thread t1; + std::thread t2 ( t1, 1, 2.0 ); +} diff --git a/libcxx/test/std/thread/thread.threads/thread.thread.class/thread.thread.constr/copy.fail.cpp b/libcxx/test/std/thread/thread.threads/thread.thread.class/thread.thread.constr/copy.fail.cpp new file mode 100644 index 00000000000..f66474c93b4 --- /dev/null +++ b/libcxx/test/std/thread/thread.threads/thread.thread.class/thread.thread.constr/copy.fail.cpp @@ -0,0 +1,66 @@ +//===----------------------------------------------------------------------===// +// +// 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. +// +//===----------------------------------------------------------------------===// + +// <thread> + +// class thread + +// thread(const thread&) = delete; + +#include <thread> +#include <new> +#include <cstdlib> +#include <cassert> + +class G +{ + int alive_; +public: + static int n_alive; + static bool op_run; + + G() : alive_(1) {++n_alive;} + G(const G& g) : alive_(g.alive_) {++n_alive;} + ~G() {alive_ = 0; --n_alive;} + + void operator()() + { + assert(alive_ == 1); + assert(n_alive >= 1); + op_run = true; + } + + void operator()(int i, double j) + { + assert(alive_ == 1); + assert(n_alive >= 1); + assert(i == 5); + assert(j == 5.5); + op_run = true; + } +}; + +int G::n_alive = 0; +bool G::op_run = false; + +int main() +{ + { + assert(G::n_alive == 0); + assert(!G::op_run); + std::thread t0(G(), 5, 5.5); + std::thread::id id = t0.get_id(); + std::thread t1 = t0; + assert(t1.get_id() == id); + assert(t0.get_id() == std::thread::id()); + t1.join(); + assert(G::n_alive == 0); + assert(G::op_run); + } +} diff --git a/libcxx/test/std/thread/thread.threads/thread.thread.class/thread.thread.constr/default.pass.cpp b/libcxx/test/std/thread/thread.threads/thread.thread.class/thread.thread.constr/default.pass.cpp new file mode 100644 index 00000000000..64d5a935ba5 --- /dev/null +++ b/libcxx/test/std/thread/thread.threads/thread.thread.class/thread.thread.constr/default.pass.cpp @@ -0,0 +1,25 @@ +//===----------------------------------------------------------------------===// +// +// 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 + +// <thread> + +// class thread + +// thread(); + +#include <thread> +#include <cassert> + +int main() +{ + std::thread t; + assert(t.get_id() == std::thread::id()); +} diff --git a/libcxx/test/std/thread/thread.threads/thread.thread.class/thread.thread.constr/move.pass.cpp b/libcxx/test/std/thread/thread.threads/thread.thread.class/thread.thread.constr/move.pass.cpp new file mode 100644 index 00000000000..36e0fbd7b59 --- /dev/null +++ b/libcxx/test/std/thread/thread.threads/thread.thread.class/thread.thread.constr/move.pass.cpp @@ -0,0 +1,70 @@ +//===----------------------------------------------------------------------===// +// +// 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 + +// <thread> + +// class thread + +// thread(thread&& t); + +#include <thread> +#include <new> +#include <cstdlib> +#include <cassert> + +class G +{ + int alive_; +public: + static int n_alive; + static bool op_run; + + G() : alive_(1) {++n_alive;} + G(const G& g) : alive_(g.alive_) {++n_alive;} + ~G() {alive_ = 0; --n_alive;} + + void operator()() + { + assert(alive_ == 1); + assert(n_alive >= 1); + op_run = true; + } + + void operator()(int i, double j) + { + assert(alive_ == 1); + assert(n_alive >= 1); + assert(i == 5); + assert(j == 5.5); + op_run = true; + } +}; + +int G::n_alive = 0; +bool G::op_run = false; + +int main() +{ +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + { + assert(G::n_alive == 0); + assert(!G::op_run); + std::thread t0(G(), 5, 5.5); + std::thread::id id = t0.get_id(); + std::thread t1 = std::move(t0); + assert(t1.get_id() == id); + assert(t0.get_id() == std::thread::id()); + t1.join(); + assert(G::n_alive == 0); + assert(G::op_run); + } +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES +} |