1bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//===----------------------------------------------------------------------===//
2bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//
3f5256e16dfc425c1d466f6308d4026d529ce9e0bHoward Hinnant//                     The LLVM Compiler Infrastructure
4bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//
5b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant// This file is dual licensed under the MIT and the University of Illinois Open
6b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant// Source Licenses. See LICENSE.TXT for details.
7bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//
8bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//===----------------------------------------------------------------------===//
9bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
10bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// <mutex>
11bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
12bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// template <class L1, class L2, class... L3>
13bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//   int try_lock(L1&, L2&, L3&...);
14bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
15bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include <mutex>
16bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include <cassert>
17bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
18bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantclass L0
19bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
20bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    bool locked_;
21bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
22bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantpublic:
23bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    L0() : locked_(false) {}
24bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
25bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    bool try_lock()
26bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
27bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        locked_ = true;
28bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return locked_;
29bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
30bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
31bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    void unlock() {locked_ = false;}
32bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
33bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    bool locked() const {return locked_;}
34bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant};
35bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
36bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantclass L1
37bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
38bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    bool locked_;
39bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
40bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantpublic:
41bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    L1() : locked_(false) {}
42bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
43bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    bool try_lock()
44bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
45bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        locked_ = false;
46bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return locked_;
47bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
48bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
49bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    void unlock() {locked_ = false;}
50bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
51bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    bool locked() const {return locked_;}
52bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant};
53bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
54bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantclass L2
55bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
56bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    bool locked_;
57bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
58bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantpublic:
59bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    L2() : locked_(false) {}
60bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
61bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    bool try_lock()
62bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
63bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        throw 1;
64bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return locked_;
65bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
66bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
67bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    void unlock() {locked_ = false;}
68bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
69bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    bool locked() const {return locked_;}
70bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant};
71bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
72bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantint main()
73bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
74bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
75bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        L0 l0;
76bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        L0 l1;
77bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(std::try_lock(l0, l1) == -1);
78bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(l0.locked());
79bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(l1.locked());
80bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
81bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
82bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        L0 l0;
83bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        L1 l1;
84bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(std::try_lock(l0, l1) == 1);
85bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(!l0.locked());
86bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(!l1.locked());
87bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
88bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
89bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        L1 l0;
90bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        L0 l1;
91bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(std::try_lock(l0, l1) == 0);
92bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(!l0.locked());
93bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(!l1.locked());
94bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
95bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
96bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        L0 l0;
97bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        L2 l1;
98bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        try
99bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
100bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            std::try_lock(l0, l1);
101bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            assert(false);
102bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
103bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        catch (int)
104bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
105bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            assert(!l0.locked());
106bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            assert(!l1.locked());
107bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
108bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
109bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
110bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        L2 l0;
111bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        L0 l1;
112bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        try
113bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
114bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            std::try_lock(l0, l1);
115bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            assert(false);
116bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
117bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        catch (int)
118bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
119bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            assert(!l0.locked());
120bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            assert(!l1.locked());
121bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
122bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
123bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS
124bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
125bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        L0 l0;
126bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        L0 l1;
127bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        L0 l2;
128bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(std::try_lock(l0, l1, l2) == -1);
129bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(l0.locked());
130bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(l1.locked());
131bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(l2.locked());
132bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
133bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
134bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        L1 l0;
135bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        L1 l1;
136bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        L1 l2;
137bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(std::try_lock(l0, l1, l2) == 0);
138bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(!l0.locked());
139bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(!l1.locked());
140bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(!l2.locked());
141bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
142bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
143bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        L2 l0;
144bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        L2 l1;
145bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        L2 l2;
146bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        try
147bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
148bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            std::try_lock(l0, l1, l2);
149bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            assert(false);
150bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
151bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        catch (int)
152bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
153bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            assert(!l0.locked());
154bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            assert(!l1.locked());
155bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            assert(!l2.locked());
156bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
157bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
158bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
159bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        L0 l0;
160bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        L1 l1;
161bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        L2 l2;
162bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(std::try_lock(l0, l1, l2) == 1);
163bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(!l0.locked());
164bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(!l1.locked());
165bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(!l2.locked());
166bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
167bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
168bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        L0 l0;
169bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        L0 l1;
170bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        L1 l2;
171bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(std::try_lock(l0, l1, l2) == 2);
172bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(!l0.locked());
173bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(!l1.locked());
174bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(!l2.locked());
175bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
176bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
177bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        L0 l0;
178bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        L1 l1;
179bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        L0 l2;
180bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(std::try_lock(l0, l1, l2) == 1);
181bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(!l0.locked());
182bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(!l1.locked());
183bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(!l2.locked());
184bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
185bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
186bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        L1 l0;
187bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        L0 l1;
188bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        L0 l2;
189bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(std::try_lock(l0, l1, l2) == 0);
190bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(!l0.locked());
191bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(!l1.locked());
192bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(!l2.locked());
193bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
194bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
195bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        L0 l0;
196bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        L0 l1;
197bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        L2 l2;
198bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        try
199bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
200bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            std::try_lock(l0, l1, l2);
201bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            assert(false);
202bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
203bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        catch (int)
204bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
205bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            assert(!l0.locked());
206bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            assert(!l1.locked());
207bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            assert(!l2.locked());
208bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
209bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
210bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
211bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        L0 l0;
212bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        L2 l1;
213bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        L0 l2;
214bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        try
215bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
216bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            std::try_lock(l0, l1, l2);
217bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            assert(false);
218bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
219bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        catch (int)
220bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
221bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            assert(!l0.locked());
222bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            assert(!l1.locked());
223bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            assert(!l2.locked());
224bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
225bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
226bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
227bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        L2 l0;
228bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        L0 l1;
229bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        L0 l2;
230bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        try
231bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
232bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            std::try_lock(l0, l1, l2);
233bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            assert(false);
234bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
235bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        catch (int)
236bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
237bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            assert(!l0.locked());
238bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            assert(!l1.locked());
239bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            assert(!l2.locked());
240bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
241bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
242bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
243bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        L1 l0;
244bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        L1 l1;
245bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        L0 l2;
246bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(std::try_lock(l0, l1, l2) == 0);
247bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(!l0.locked());
248bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(!l1.locked());
249bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(!l2.locked());
250bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
251bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
252bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        L1 l0;
253bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        L0 l1;
254bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        L1 l2;
255bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(std::try_lock(l0, l1, l2) == 0);
256bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(!l0.locked());
257bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(!l1.locked());
258bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(!l2.locked());
259bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
260bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
261bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        L0 l0;
262bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        L1 l1;
263bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        L1 l2;
264bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(std::try_lock(l0, l1, l2) == 1);
265bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(!l0.locked());
266bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(!l1.locked());
267bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(!l2.locked());
268bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
269bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
270bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        L1 l0;
271bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        L1 l1;
272bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        L2 l2;
273bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(std::try_lock(l0, l1, l2) == 0);
274bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(!l0.locked());
275bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(!l1.locked());
276bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(!l2.locked());
277bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
278bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
279bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        L1 l0;
280bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        L2 l1;
281bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        L1 l2;
282bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(std::try_lock(l0, l1, l2) == 0);
283bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(!l0.locked());
284bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(!l1.locked());
285bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(!l2.locked());
286bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
287bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
288bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        L2 l0;
289bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        L1 l1;
290bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        L1 l2;
291bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        try
292bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
293bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            std::try_lock(l0, l1, l2);
294bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            assert(false);
295bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
296bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        catch (int)
297bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
298bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            assert(!l0.locked());
299bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            assert(!l1.locked());
300bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            assert(!l2.locked());
301bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
302bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
303bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
304bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        L2 l0;
305bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        L2 l1;
306bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        L0 l2;
307bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        try
308bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
309bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            std::try_lock(l0, l1, l2);
310bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            assert(false);
311bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
312bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        catch (int)
313bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
314bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            assert(!l0.locked());
315bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            assert(!l1.locked());
316bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            assert(!l2.locked());
317bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
318bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
319bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
320bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        L2 l0;
321bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        L0 l1;
322bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        L2 l2;
323bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        try
324bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
325bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            std::try_lock(l0, l1, l2);
326bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            assert(false);
327bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
328bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        catch (int)
329bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
330bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            assert(!l0.locked());
331bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            assert(!l1.locked());
332bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            assert(!l2.locked());
333bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
334bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
335bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
336bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        L0 l0;
337bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        L2 l1;
338bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        L2 l2;
339bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        try
340bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
341bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            std::try_lock(l0, l1, l2);
342bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            assert(false);
343bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
344bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        catch (int)
345bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
346bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            assert(!l0.locked());
347bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            assert(!l1.locked());
348bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            assert(!l2.locked());
349bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
350bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
351bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
352bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        L2 l0;
353bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        L2 l1;
354bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        L1 l2;
355bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        try
356bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
357bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            std::try_lock(l0, l1, l2);
358bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            assert(false);
359bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
360bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        catch (int)
361bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
362bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            assert(!l0.locked());
363bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            assert(!l1.locked());
364bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            assert(!l2.locked());
365bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
366bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
367bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
368bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        L2 l0;
369bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        L1 l1;
370bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        L2 l2;
371bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        try
372bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
373bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            std::try_lock(l0, l1, l2);
374bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            assert(false);
375bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
376bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        catch (int)
377bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
378bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            assert(!l0.locked());
379bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            assert(!l1.locked());
380bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            assert(!l2.locked());
381bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
382bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
383bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
384bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        L1 l0;
385bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        L2 l1;
386bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        L2 l2;
387bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(std::try_lock(l0, l1, l2) == 0);
388bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(!l0.locked());
389bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(!l1.locked());
390bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(!l2.locked());
391bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
392bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
393bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        L0 l0;
394bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        L2 l1;
395bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        L1 l2;
396bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        try
397bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
398bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            std::try_lock(l0, l1, l2);
399bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            assert(false);
400bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
401bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        catch (int)
402bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
403bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            assert(!l0.locked());
404bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            assert(!l1.locked());
405bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            assert(!l2.locked());
406bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
407bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
408bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
409bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        L1 l0;
410bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        L0 l1;
411bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        L2 l2;
412bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(std::try_lock(l0, l1, l2) == 0);
413bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(!l0.locked());
414bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(!l1.locked());
415bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(!l2.locked());
416bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
417bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
418bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        L1 l0;
419bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        L2 l1;
420bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        L0 l2;
421bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(std::try_lock(l0, l1, l2) == 0);
422bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(!l0.locked());
423bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(!l1.locked());
424bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(!l2.locked());
425bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
426bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
427bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        L2 l0;
428bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        L0 l1;
429bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        L1 l2;
430bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        try
431bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
432bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            std::try_lock(l0, l1, l2);
433bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            assert(false);
434bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
435bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        catch (int)
436bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
437bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            assert(!l0.locked());
438bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            assert(!l1.locked());
439bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            assert(!l2.locked());
440bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
441bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
442bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
443bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        L2 l0;
444bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        L1 l1;
445bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        L0 l2;
446bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        try
447bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
448bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            std::try_lock(l0, l1, l2);
449bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            assert(false);
450bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
451bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        catch (int)
452bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
453bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            assert(!l0.locked());
454bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            assert(!l1.locked());
455bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            assert(!l2.locked());
456bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
457bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
458bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
459bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        L0 l0;
460bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        L0 l1;
461bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        L0 l2;
462bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        L0 l3;
463bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(std::try_lock(l0, l1, l2, l3) == -1);
464bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(l0.locked());
465bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(l1.locked());
466bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(l2.locked());
467bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(l3.locked());
468bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
469bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
470bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        L1 l0;
471bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        L0 l1;
472bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        L0 l2;
473bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        L0 l3;
474bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(std::try_lock(l0, l1, l2, l3) == 0);
475bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(!l0.locked());
476bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(!l1.locked());
477bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(!l2.locked());
478bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(!l3.locked());
479bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
480bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
481bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        L0 l0;
482bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        L1 l1;
483bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        L0 l2;
484bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        L0 l3;
485bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(std::try_lock(l0, l1, l2, l3) == 1);
486bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(!l0.locked());
487bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(!l1.locked());
488bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(!l2.locked());
489bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(!l3.locked());
490bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
491bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
492bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        L0 l0;
493bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        L0 l1;
494bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        L1 l2;
495bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        L0 l3;
496bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(std::try_lock(l0, l1, l2, l3) == 2);
497bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(!l0.locked());
498bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(!l1.locked());
499bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(!l2.locked());
500bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(!l3.locked());
501bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
502bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
503bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        L0 l0;
504bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        L0 l1;
505bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        L0 l2;
506bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        L1 l3;
507bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(std::try_lock(l0, l1, l2, l3) == 3);
508bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(!l0.locked());
509bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(!l1.locked());
510bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(!l2.locked());
511bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(!l3.locked());
512bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
513f11ea144609929bb96a05f583ad7c29abd142730Howard Hinnant#endif  // _LIBCPP_HAS_NO_VARIADICS
514bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
515