blob: 522c61b02d17318c8b48bc172948ddab19d839c3 [file] [log] [blame]
Dan Albert1d4a1ed2016-05-25 22:36:09 -07001//===----------------------------------------------------------------------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is dual licensed under the MIT and the University of Illinois Open
6// Source Licenses. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// UNSUPPORTED: libcpp-has-no-threads
11
12#include <thread>
13#include <condition_variable>
14#include <mutex>
15#include <chrono>
16#include <iostream>
17#include <cassert>
18
19void f1()
20{
21 std::exit(0);
22}
23
24struct Mutex
25{
26 unsigned state = 0;
27 Mutex() = default;
28 ~Mutex() = default;
29 Mutex(const Mutex&) = delete;
30 Mutex& operator=(const Mutex&) = delete;
31
32 void lock()
33 {
34 if (++state == 2)
35 throw 1; // this throw should end up calling terminate()
36 }
37
38 void unlock() {}
39};
40
41Mutex mut;
42std::condition_variable_any cv;
43
44void
45signal_me()
46{
47 std::this_thread::sleep_for(std::chrono::milliseconds(500));
48 cv.notify_one();
49}
50
51int
52main()
53{
54 std::set_terminate(f1);
55 try
56 {
57 std::thread(signal_me).detach();
58 mut.lock();
59 cv.wait(mut);
60 }
61 catch (...) {}
62 assert(false);
63}