1//===----------------------------------------------------------------------===//
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// <mutex>
13
14// template <class Mutex> class unique_lock;
15
16// void unlock();
17
18#include <mutex>
19#include <cassert>
20
21bool unlock_called = false;
22
23struct mutex
24{
25    void lock() {}
26    void unlock() {unlock_called = true;}
27};
28
29mutex m;
30
31int main()
32{
33    std::unique_lock<mutex> lk(m);
34    lk.unlock();
35    assert(unlock_called == true);
36    assert(lk.owns_lock() == false);
37    try
38    {
39        lk.unlock();
40        assert(false);
41    }
42    catch (std::system_error& e)
43    {
44        assert(e.code().value() == EPERM);
45    }
46    lk.release();
47    try
48    {
49        lk.unlock();
50        assert(false);
51    }
52    catch (std::system_error& e)
53    {
54        assert(e.code().value() == EPERM);
55    }
56}
57