1*7a6aaf9bSLouis Dionne //===----------------------------------------------------------------------===//
2*7a6aaf9bSLouis Dionne //
3*7a6aaf9bSLouis Dionne // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*7a6aaf9bSLouis Dionne // See https://llvm.org/LICENSE.txt for license information.
5*7a6aaf9bSLouis Dionne // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*7a6aaf9bSLouis Dionne //
7*7a6aaf9bSLouis Dionne //===----------------------------------------------------------------------===//
8*7a6aaf9bSLouis Dionne 
9*7a6aaf9bSLouis Dionne // <thread>
10*7a6aaf9bSLouis Dionne 
11*7a6aaf9bSLouis Dionne // class thread
12*7a6aaf9bSLouis Dionne 
13*7a6aaf9bSLouis Dionne // thread& operator=(thread&& t);
14*7a6aaf9bSLouis Dionne 
15*7a6aaf9bSLouis Dionne #include <thread>
16*7a6aaf9bSLouis Dionne #include <new>
17*7a6aaf9bSLouis Dionne #include <cstdlib>
18*7a6aaf9bSLouis Dionne #include <cassert>
19*7a6aaf9bSLouis Dionne 
20*7a6aaf9bSLouis Dionne class G
21*7a6aaf9bSLouis Dionne {
22*7a6aaf9bSLouis Dionne     int alive_;
23*7a6aaf9bSLouis Dionne public:
24*7a6aaf9bSLouis Dionne     static int n_alive;
25*7a6aaf9bSLouis Dionne     static bool op_run;
26*7a6aaf9bSLouis Dionne 
27*7a6aaf9bSLouis Dionne     G() : alive_(1) {++n_alive;}
28*7a6aaf9bSLouis Dionne     G(const G& g) : alive_(g.alive_) {++n_alive;}
29*7a6aaf9bSLouis Dionne     ~G() {alive_ = 0; --n_alive;}
30*7a6aaf9bSLouis Dionne 
31*7a6aaf9bSLouis Dionne     void operator()()
32*7a6aaf9bSLouis Dionne     {
33*7a6aaf9bSLouis Dionne         assert(alive_ == 1);
34*7a6aaf9bSLouis Dionne         assert(n_alive >= 1);
35*7a6aaf9bSLouis Dionne         op_run = true;
36*7a6aaf9bSLouis Dionne     }
37*7a6aaf9bSLouis Dionne 
38*7a6aaf9bSLouis Dionne };
39*7a6aaf9bSLouis Dionne 
40*7a6aaf9bSLouis Dionne int G::n_alive = 0;
41*7a6aaf9bSLouis Dionne bool G::op_run = false;
42*7a6aaf9bSLouis Dionne 
43*7a6aaf9bSLouis Dionne int main(int, char**)
44*7a6aaf9bSLouis Dionne {
45*7a6aaf9bSLouis Dionne     {
46*7a6aaf9bSLouis Dionne         std::thread t0(G());
47*7a6aaf9bSLouis Dionne         std::thread t1;
48*7a6aaf9bSLouis Dionne         t1 = t0;
49*7a6aaf9bSLouis Dionne     }
50*7a6aaf9bSLouis Dionne 
51*7a6aaf9bSLouis Dionne   return 0;
52*7a6aaf9bSLouis Dionne }
53