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