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