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