15a83710eSEric Fiselier //===----------------------------------------------------------------------===//
25a83710eSEric Fiselier //
35a83710eSEric Fiselier //                     The LLVM Compiler Infrastructure
45a83710eSEric Fiselier //
55a83710eSEric Fiselier // This file is dual licensed under the MIT and the University of Illinois Open
65a83710eSEric Fiselier // Source Licenses. See LICENSE.TXT for details.
75a83710eSEric Fiselier //
85a83710eSEric Fiselier //===----------------------------------------------------------------------===//
95a83710eSEric Fiselier //
10f520c144SAsiri Rathnayake // XFAIL: libcpp-no-exceptions
115a83710eSEric Fiselier // UNSUPPORTED: libcpp-has-no-threads
125a83710eSEric Fiselier 
13*76e316f9SEric Fiselier // This test hangs forever when built against libstdc++. In order to allow
14*76e316f9SEric Fiselier // validation of the test suite against other STLs we have to mark it
15*76e316f9SEric Fiselier // unsupported.
16*76e316f9SEric Fiselier // UNSUPPORTED: libstdc++
17*76e316f9SEric Fiselier 
185a83710eSEric Fiselier // <mutex>
195a83710eSEric Fiselier 
205a83710eSEric Fiselier // template <class L1, class L2, class... L3>
215a83710eSEric Fiselier //   void lock(L1&, L2&, L3&...);
225a83710eSEric Fiselier 
235a83710eSEric Fiselier #include <mutex>
245a83710eSEric Fiselier #include <cassert>
255a83710eSEric Fiselier 
265a83710eSEric Fiselier class L0
275a83710eSEric Fiselier {
285a83710eSEric Fiselier     bool locked_;
295a83710eSEric Fiselier 
305a83710eSEric Fiselier public:
315a83710eSEric Fiselier     L0() : locked_(false) {}
325a83710eSEric Fiselier 
335a83710eSEric Fiselier     void lock()
345a83710eSEric Fiselier     {
355a83710eSEric Fiselier         locked_ = true;
365a83710eSEric Fiselier     }
375a83710eSEric Fiselier 
385a83710eSEric Fiselier     bool try_lock()
395a83710eSEric Fiselier     {
405a83710eSEric Fiselier         locked_ = true;
415a83710eSEric Fiselier         return locked_;
425a83710eSEric Fiselier     }
435a83710eSEric Fiselier 
445a83710eSEric Fiselier     void unlock() {locked_ = false;}
455a83710eSEric Fiselier 
465a83710eSEric Fiselier     bool locked() const {return locked_;}
475a83710eSEric Fiselier };
485a83710eSEric Fiselier 
495a83710eSEric Fiselier class L1
505a83710eSEric Fiselier {
515a83710eSEric Fiselier     bool locked_;
525a83710eSEric Fiselier 
535a83710eSEric Fiselier public:
545a83710eSEric Fiselier     L1() : locked_(false) {}
555a83710eSEric Fiselier 
565a83710eSEric Fiselier     void lock()
575a83710eSEric Fiselier     {
585a83710eSEric Fiselier         locked_ = true;
595a83710eSEric Fiselier     }
605a83710eSEric Fiselier 
615a83710eSEric Fiselier     bool try_lock()
625a83710eSEric Fiselier     {
635a83710eSEric Fiselier         locked_ = false;
645a83710eSEric Fiselier         return locked_;
655a83710eSEric Fiselier     }
665a83710eSEric Fiselier 
675a83710eSEric Fiselier     void unlock() {locked_ = false;}
685a83710eSEric Fiselier 
695a83710eSEric Fiselier     bool locked() const {return locked_;}
705a83710eSEric Fiselier };
715a83710eSEric Fiselier 
725a83710eSEric Fiselier class L2
735a83710eSEric Fiselier {
745a83710eSEric Fiselier     bool locked_;
755a83710eSEric Fiselier 
765a83710eSEric Fiselier public:
775a83710eSEric Fiselier     L2() : locked_(false) {}
785a83710eSEric Fiselier 
795a83710eSEric Fiselier     void lock()
805a83710eSEric Fiselier     {
815a83710eSEric Fiselier         throw 1;
825a83710eSEric Fiselier     }
835a83710eSEric Fiselier 
845a83710eSEric Fiselier     bool try_lock()
855a83710eSEric Fiselier     {
865a83710eSEric Fiselier         throw 1;
875a83710eSEric Fiselier         return locked_;
885a83710eSEric Fiselier     }
895a83710eSEric Fiselier 
905a83710eSEric Fiselier     void unlock() {locked_ = false;}
915a83710eSEric Fiselier 
925a83710eSEric Fiselier     bool locked() const {return locked_;}
935a83710eSEric Fiselier };
945a83710eSEric Fiselier 
955a83710eSEric Fiselier int main()
965a83710eSEric Fiselier {
975a83710eSEric Fiselier     {
985a83710eSEric Fiselier         L0 l0;
995a83710eSEric Fiselier         L0 l1;
1005a83710eSEric Fiselier         std::lock(l0, l1);
1015a83710eSEric Fiselier         assert(l0.locked());
1025a83710eSEric Fiselier         assert(l1.locked());
1035a83710eSEric Fiselier     }
1045a83710eSEric Fiselier     {
1055a83710eSEric Fiselier         L0 l0;
1065a83710eSEric Fiselier         L1 l1;
1075a83710eSEric Fiselier         std::lock(l0, l1);
1085a83710eSEric Fiselier         assert(l0.locked());
1095a83710eSEric Fiselier         assert(l1.locked());
1105a83710eSEric Fiselier     }
1115a83710eSEric Fiselier     {
1125a83710eSEric Fiselier         L1 l0;
1135a83710eSEric Fiselier         L0 l1;
1145a83710eSEric Fiselier         std::lock(l0, l1);
1155a83710eSEric Fiselier         assert(l0.locked());
1165a83710eSEric Fiselier         assert(l1.locked());
1175a83710eSEric Fiselier     }
1185a83710eSEric Fiselier     {
1195a83710eSEric Fiselier         L0 l0;
1205a83710eSEric Fiselier         L2 l1;
1215a83710eSEric Fiselier         try
1225a83710eSEric Fiselier         {
1235a83710eSEric Fiselier             std::lock(l0, l1);
1245a83710eSEric Fiselier             assert(false);
1255a83710eSEric Fiselier         }
1265a83710eSEric Fiselier         catch (int)
1275a83710eSEric Fiselier         {
1285a83710eSEric Fiselier             assert(!l0.locked());
1295a83710eSEric Fiselier             assert(!l1.locked());
1305a83710eSEric Fiselier         }
1315a83710eSEric Fiselier     }
1325a83710eSEric Fiselier     {
1335a83710eSEric Fiselier         L2 l0;
1345a83710eSEric Fiselier         L0 l1;
1355a83710eSEric Fiselier         try
1365a83710eSEric Fiselier         {
1375a83710eSEric Fiselier             std::lock(l0, l1);
1385a83710eSEric Fiselier             assert(false);
1395a83710eSEric Fiselier         }
1405a83710eSEric Fiselier         catch (int)
1415a83710eSEric Fiselier         {
1425a83710eSEric Fiselier             assert(!l0.locked());
1435a83710eSEric Fiselier             assert(!l1.locked());
1445a83710eSEric Fiselier         }
1455a83710eSEric Fiselier     }
1465a83710eSEric Fiselier     {
1475a83710eSEric Fiselier         L1 l0;
1485a83710eSEric Fiselier         L2 l1;
1495a83710eSEric Fiselier         try
1505a83710eSEric Fiselier         {
1515a83710eSEric Fiselier             std::lock(l0, l1);
1525a83710eSEric Fiselier             assert(false);
1535a83710eSEric Fiselier         }
1545a83710eSEric Fiselier         catch (int)
1555a83710eSEric Fiselier         {
1565a83710eSEric Fiselier             assert(!l0.locked());
1575a83710eSEric Fiselier             assert(!l1.locked());
1585a83710eSEric Fiselier         }
1595a83710eSEric Fiselier     }
1605a83710eSEric Fiselier     {
1615a83710eSEric Fiselier         L2 l0;
1625a83710eSEric Fiselier         L1 l1;
1635a83710eSEric Fiselier         try
1645a83710eSEric Fiselier         {
1655a83710eSEric Fiselier             std::lock(l0, l1);
1665a83710eSEric Fiselier             assert(false);
1675a83710eSEric Fiselier         }
1685a83710eSEric Fiselier         catch (int)
1695a83710eSEric Fiselier         {
1705a83710eSEric Fiselier             assert(!l0.locked());
1715a83710eSEric Fiselier             assert(!l1.locked());
1725a83710eSEric Fiselier         }
1735a83710eSEric Fiselier     }
1745a83710eSEric Fiselier     {
1755a83710eSEric Fiselier         L2 l0;
1765a83710eSEric Fiselier         L2 l1;
1775a83710eSEric Fiselier         try
1785a83710eSEric Fiselier         {
1795a83710eSEric Fiselier             std::lock(l0, l1);
1805a83710eSEric Fiselier             assert(false);
1815a83710eSEric Fiselier         }
1825a83710eSEric Fiselier         catch (int)
1835a83710eSEric Fiselier         {
1845a83710eSEric Fiselier             assert(!l0.locked());
1855a83710eSEric Fiselier             assert(!l1.locked());
1865a83710eSEric Fiselier         }
1875a83710eSEric Fiselier     }
1885a83710eSEric Fiselier #ifndef _LIBCPP_HAS_NO_VARIADICS
1895a83710eSEric Fiselier     {
1905a83710eSEric Fiselier         L0 l0;
1915a83710eSEric Fiselier         L0 l1;
1925a83710eSEric Fiselier         L0 l2;
1935a83710eSEric Fiselier         std::lock(l0, l1, l2);
1945a83710eSEric Fiselier         assert(l0.locked());
1955a83710eSEric Fiselier         assert(l1.locked());
1965a83710eSEric Fiselier         assert(l2.locked());
1975a83710eSEric Fiselier     }
1985a83710eSEric Fiselier     {
1995a83710eSEric Fiselier         L2 l0;
2005a83710eSEric Fiselier         L2 l1;
2015a83710eSEric Fiselier         L2 l2;
2025a83710eSEric Fiselier         try
2035a83710eSEric Fiselier         {
2045a83710eSEric Fiselier             std::lock(l0, l1, l2);
2055a83710eSEric Fiselier             assert(false);
2065a83710eSEric Fiselier         }
2075a83710eSEric Fiselier         catch (int)
2085a83710eSEric Fiselier         {
2095a83710eSEric Fiselier             assert(!l0.locked());
2105a83710eSEric Fiselier             assert(!l1.locked());
2115a83710eSEric Fiselier             assert(!l2.locked());
2125a83710eSEric Fiselier         }
2135a83710eSEric Fiselier     }
2145a83710eSEric Fiselier     {
2155a83710eSEric Fiselier         L0 l0;
2165a83710eSEric Fiselier         L0 l1;
2175a83710eSEric Fiselier         L1 l2;
2185a83710eSEric Fiselier         std::lock(l0, l1, l2);
2195a83710eSEric Fiselier         assert(l0.locked());
2205a83710eSEric Fiselier         assert(l1.locked());
2215a83710eSEric Fiselier         assert(l2.locked());
2225a83710eSEric Fiselier     }
2235a83710eSEric Fiselier     {
2245a83710eSEric Fiselier         L0 l0;
2255a83710eSEric Fiselier         L1 l1;
2265a83710eSEric Fiselier         L0 l2;
2275a83710eSEric Fiselier         std::lock(l0, l1, l2);
2285a83710eSEric Fiselier         assert(l0.locked());
2295a83710eSEric Fiselier         assert(l1.locked());
2305a83710eSEric Fiselier         assert(l2.locked());
2315a83710eSEric Fiselier     }
2325a83710eSEric Fiselier     {
2335a83710eSEric Fiselier         L1 l0;
2345a83710eSEric Fiselier         L0 l1;
2355a83710eSEric Fiselier         L0 l2;
2365a83710eSEric Fiselier         std::lock(l0, l1, l2);
2375a83710eSEric Fiselier         assert(l0.locked());
2385a83710eSEric Fiselier         assert(l1.locked());
2395a83710eSEric Fiselier         assert(l2.locked());
2405a83710eSEric Fiselier     }
2415a83710eSEric Fiselier     {
2425a83710eSEric Fiselier         L0 l0;
2435a83710eSEric Fiselier         L0 l1;
2445a83710eSEric Fiselier         L2 l2;
2455a83710eSEric Fiselier         try
2465a83710eSEric Fiselier         {
2475a83710eSEric Fiselier             std::lock(l0, l1, l2);
2485a83710eSEric Fiselier             assert(false);
2495a83710eSEric Fiselier         }
2505a83710eSEric Fiselier         catch (int)
2515a83710eSEric Fiselier         {
2525a83710eSEric Fiselier             assert(!l0.locked());
2535a83710eSEric Fiselier             assert(!l1.locked());
2545a83710eSEric Fiselier             assert(!l2.locked());
2555a83710eSEric Fiselier         }
2565a83710eSEric Fiselier     }
2575a83710eSEric Fiselier     {
2585a83710eSEric Fiselier         L0 l0;
2595a83710eSEric Fiselier         L2 l1;
2605a83710eSEric Fiselier         L0 l2;
2615a83710eSEric Fiselier         try
2625a83710eSEric Fiselier         {
2635a83710eSEric Fiselier             std::lock(l0, l1, l2);
2645a83710eSEric Fiselier             assert(false);
2655a83710eSEric Fiselier         }
2665a83710eSEric Fiselier         catch (int)
2675a83710eSEric Fiselier         {
2685a83710eSEric Fiselier             assert(!l0.locked());
2695a83710eSEric Fiselier             assert(!l1.locked());
2705a83710eSEric Fiselier             assert(!l2.locked());
2715a83710eSEric Fiselier         }
2725a83710eSEric Fiselier     }
2735a83710eSEric Fiselier     {
2745a83710eSEric Fiselier         L2 l0;
2755a83710eSEric Fiselier         L0 l1;
2765a83710eSEric Fiselier         L0 l2;
2775a83710eSEric Fiselier         try
2785a83710eSEric Fiselier         {
2795a83710eSEric Fiselier             std::lock(l0, l1, l2);
2805a83710eSEric Fiselier             assert(false);
2815a83710eSEric Fiselier         }
2825a83710eSEric Fiselier         catch (int)
2835a83710eSEric Fiselier         {
2845a83710eSEric Fiselier             assert(!l0.locked());
2855a83710eSEric Fiselier             assert(!l1.locked());
2865a83710eSEric Fiselier             assert(!l2.locked());
2875a83710eSEric Fiselier         }
2885a83710eSEric Fiselier     }
2895a83710eSEric Fiselier     {
2905a83710eSEric Fiselier         L2 l0;
2915a83710eSEric Fiselier         L2 l1;
2925a83710eSEric Fiselier         L0 l2;
2935a83710eSEric Fiselier         try
2945a83710eSEric Fiselier         {
2955a83710eSEric Fiselier             std::lock(l0, l1, l2);
2965a83710eSEric Fiselier             assert(false);
2975a83710eSEric Fiselier         }
2985a83710eSEric Fiselier         catch (int)
2995a83710eSEric Fiselier         {
3005a83710eSEric Fiselier             assert(!l0.locked());
3015a83710eSEric Fiselier             assert(!l1.locked());
3025a83710eSEric Fiselier             assert(!l2.locked());
3035a83710eSEric Fiselier         }
3045a83710eSEric Fiselier     }
3055a83710eSEric Fiselier     {
3065a83710eSEric Fiselier         L2 l0;
3075a83710eSEric Fiselier         L0 l1;
3085a83710eSEric Fiselier         L2 l2;
3095a83710eSEric Fiselier         try
3105a83710eSEric Fiselier         {
3115a83710eSEric Fiselier             std::lock(l0, l1, l2);
3125a83710eSEric Fiselier             assert(false);
3135a83710eSEric Fiselier         }
3145a83710eSEric Fiselier         catch (int)
3155a83710eSEric Fiselier         {
3165a83710eSEric Fiselier             assert(!l0.locked());
3175a83710eSEric Fiselier             assert(!l1.locked());
3185a83710eSEric Fiselier             assert(!l2.locked());
3195a83710eSEric Fiselier         }
3205a83710eSEric Fiselier     }
3215a83710eSEric Fiselier     {
3225a83710eSEric Fiselier         L0 l0;
3235a83710eSEric Fiselier         L2 l1;
3245a83710eSEric Fiselier         L2 l2;
3255a83710eSEric Fiselier         try
3265a83710eSEric Fiselier         {
3275a83710eSEric Fiselier             std::lock(l0, l1, l2);
3285a83710eSEric Fiselier             assert(false);
3295a83710eSEric Fiselier         }
3305a83710eSEric Fiselier         catch (int)
3315a83710eSEric Fiselier         {
3325a83710eSEric Fiselier             assert(!l0.locked());
3335a83710eSEric Fiselier             assert(!l1.locked());
3345a83710eSEric Fiselier             assert(!l2.locked());
3355a83710eSEric Fiselier         }
3365a83710eSEric Fiselier     }
3375a83710eSEric Fiselier     {
3385a83710eSEric Fiselier         L2 l0;
3395a83710eSEric Fiselier         L2 l1;
3405a83710eSEric Fiselier         L1 l2;
3415a83710eSEric Fiselier         try
3425a83710eSEric Fiselier         {
3435a83710eSEric Fiselier             std::lock(l0, l1, l2);
3445a83710eSEric Fiselier             assert(false);
3455a83710eSEric Fiselier         }
3465a83710eSEric Fiselier         catch (int)
3475a83710eSEric Fiselier         {
3485a83710eSEric Fiselier             assert(!l0.locked());
3495a83710eSEric Fiselier             assert(!l1.locked());
3505a83710eSEric Fiselier             assert(!l2.locked());
3515a83710eSEric Fiselier         }
3525a83710eSEric Fiselier     }
3535a83710eSEric Fiselier     {
3545a83710eSEric Fiselier         L2 l0;
3555a83710eSEric Fiselier         L1 l1;
3565a83710eSEric Fiselier         L2 l2;
3575a83710eSEric Fiselier         try
3585a83710eSEric Fiselier         {
3595a83710eSEric Fiselier             std::lock(l0, l1, l2);
3605a83710eSEric Fiselier             assert(false);
3615a83710eSEric Fiselier         }
3625a83710eSEric Fiselier         catch (int)
3635a83710eSEric Fiselier         {
3645a83710eSEric Fiselier             assert(!l0.locked());
3655a83710eSEric Fiselier             assert(!l1.locked());
3665a83710eSEric Fiselier             assert(!l2.locked());
3675a83710eSEric Fiselier         }
3685a83710eSEric Fiselier     }
3695a83710eSEric Fiselier     {
3705a83710eSEric Fiselier         L1 l0;
3715a83710eSEric Fiselier         L2 l1;
3725a83710eSEric Fiselier         L2 l2;
3735a83710eSEric Fiselier         try
3745a83710eSEric Fiselier         {
3755a83710eSEric Fiselier             std::lock(l0, l1, l2);
3765a83710eSEric Fiselier             assert(false);
3775a83710eSEric Fiselier         }
3785a83710eSEric Fiselier         catch (int)
3795a83710eSEric Fiselier         {
3805a83710eSEric Fiselier             assert(!l0.locked());
3815a83710eSEric Fiselier             assert(!l1.locked());
3825a83710eSEric Fiselier             assert(!l2.locked());
3835a83710eSEric Fiselier         }
3845a83710eSEric Fiselier     }
3855a83710eSEric Fiselier     {
3865a83710eSEric Fiselier         L0 l0;
3875a83710eSEric Fiselier         L0 l1;
3885a83710eSEric Fiselier         L0 l2;
3895a83710eSEric Fiselier         L0 l3;
3905a83710eSEric Fiselier         std::lock(l0, l1, l2, l3);
3915a83710eSEric Fiselier         assert(l0.locked());
3925a83710eSEric Fiselier         assert(l1.locked());
3935a83710eSEric Fiselier         assert(l2.locked());
3945a83710eSEric Fiselier         assert(l3.locked());
3955a83710eSEric Fiselier     }
3965a83710eSEric Fiselier     {
3975a83710eSEric Fiselier         L0 l0;
3985a83710eSEric Fiselier         L0 l1;
3995a83710eSEric Fiselier         L0 l2;
4005a83710eSEric Fiselier         L1 l3;
4015a83710eSEric Fiselier         std::lock(l0, l1, l2, l3);
4025a83710eSEric Fiselier         assert(l0.locked());
4035a83710eSEric Fiselier         assert(l1.locked());
4045a83710eSEric Fiselier         assert(l2.locked());
4055a83710eSEric Fiselier         assert(l3.locked());
4065a83710eSEric Fiselier     }
4075a83710eSEric Fiselier     {
4085a83710eSEric Fiselier         L0 l0;
4095a83710eSEric Fiselier         L0 l1;
4105a83710eSEric Fiselier         L1 l2;
4115a83710eSEric Fiselier         L0 l3;
4125a83710eSEric Fiselier         std::lock(l0, l1, l2, l3);
4135a83710eSEric Fiselier         assert(l0.locked());
4145a83710eSEric Fiselier         assert(l1.locked());
4155a83710eSEric Fiselier         assert(l2.locked());
4165a83710eSEric Fiselier         assert(l3.locked());
4175a83710eSEric Fiselier     }
4185a83710eSEric Fiselier     {
4195a83710eSEric Fiselier         L0 l0;
4205a83710eSEric Fiselier         L1 l1;
4215a83710eSEric Fiselier         L0 l2;
4225a83710eSEric Fiselier         L0 l3;
4235a83710eSEric Fiselier         std::lock(l0, l1, l2, l3);
4245a83710eSEric Fiselier         assert(l0.locked());
4255a83710eSEric Fiselier         assert(l1.locked());
4265a83710eSEric Fiselier         assert(l2.locked());
4275a83710eSEric Fiselier         assert(l3.locked());
4285a83710eSEric Fiselier     }
4295a83710eSEric Fiselier     {
4305a83710eSEric Fiselier         L1 l0;
4315a83710eSEric Fiselier         L0 l1;
4325a83710eSEric Fiselier         L0 l2;
4335a83710eSEric Fiselier         L0 l3;
4345a83710eSEric Fiselier         std::lock(l0, l1, l2, l3);
4355a83710eSEric Fiselier         assert(l0.locked());
4365a83710eSEric Fiselier         assert(l1.locked());
4375a83710eSEric Fiselier         assert(l2.locked());
4385a83710eSEric Fiselier         assert(l3.locked());
4395a83710eSEric Fiselier     }
4405a83710eSEric Fiselier     {
4415a83710eSEric Fiselier         L0 l0;
4425a83710eSEric Fiselier         L0 l1;
4435a83710eSEric Fiselier         L0 l2;
4445a83710eSEric Fiselier         L2 l3;
4455a83710eSEric Fiselier         try
4465a83710eSEric Fiselier         {
4475a83710eSEric Fiselier             std::lock(l0, l1, l2, l3);
4485a83710eSEric Fiselier             assert(false);
4495a83710eSEric Fiselier         }
4505a83710eSEric Fiselier         catch (int)
4515a83710eSEric Fiselier         {
4525a83710eSEric Fiselier             assert(!l0.locked());
4535a83710eSEric Fiselier             assert(!l1.locked());
4545a83710eSEric Fiselier             assert(!l2.locked());
4555a83710eSEric Fiselier             assert(!l3.locked());
4565a83710eSEric Fiselier         }
4575a83710eSEric Fiselier     }
4585a83710eSEric Fiselier     {
4595a83710eSEric Fiselier         L0 l0;
4605a83710eSEric Fiselier         L0 l1;
4615a83710eSEric Fiselier         L2 l2;
4625a83710eSEric Fiselier         L0 l3;
4635a83710eSEric Fiselier         try
4645a83710eSEric Fiselier         {
4655a83710eSEric Fiselier             std::lock(l0, l1, l2, l3);
4665a83710eSEric Fiselier             assert(false);
4675a83710eSEric Fiselier         }
4685a83710eSEric Fiselier         catch (int)
4695a83710eSEric Fiselier         {
4705a83710eSEric Fiselier             assert(!l0.locked());
4715a83710eSEric Fiselier             assert(!l1.locked());
4725a83710eSEric Fiselier             assert(!l2.locked());
4735a83710eSEric Fiselier             assert(!l3.locked());
4745a83710eSEric Fiselier         }
4755a83710eSEric Fiselier     }
4765a83710eSEric Fiselier     {
4775a83710eSEric Fiselier         L0 l0;
4785a83710eSEric Fiselier         L2 l1;
4795a83710eSEric Fiselier         L0 l2;
4805a83710eSEric Fiselier         L0 l3;
4815a83710eSEric Fiselier         try
4825a83710eSEric Fiselier         {
4835a83710eSEric Fiselier             std::lock(l0, l1, l2, l3);
4845a83710eSEric Fiselier             assert(false);
4855a83710eSEric Fiselier         }
4865a83710eSEric Fiselier         catch (int)
4875a83710eSEric Fiselier         {
4885a83710eSEric Fiselier             assert(!l0.locked());
4895a83710eSEric Fiselier             assert(!l1.locked());
4905a83710eSEric Fiselier             assert(!l2.locked());
4915a83710eSEric Fiselier             assert(!l3.locked());
4925a83710eSEric Fiselier         }
4935a83710eSEric Fiselier     }
4945a83710eSEric Fiselier     {
4955a83710eSEric Fiselier         L2 l0;
4965a83710eSEric Fiselier         L0 l1;
4975a83710eSEric Fiselier         L0 l2;
4985a83710eSEric Fiselier         L0 l3;
4995a83710eSEric Fiselier         try
5005a83710eSEric Fiselier         {
5015a83710eSEric Fiselier             std::lock(l0, l1, l2, l3);
5025a83710eSEric Fiselier             assert(false);
5035a83710eSEric Fiselier         }
5045a83710eSEric Fiselier         catch (int)
5055a83710eSEric Fiselier         {
5065a83710eSEric Fiselier             assert(!l0.locked());
5075a83710eSEric Fiselier             assert(!l1.locked());
5085a83710eSEric Fiselier             assert(!l2.locked());
5095a83710eSEric Fiselier             assert(!l3.locked());
5105a83710eSEric Fiselier         }
5115a83710eSEric Fiselier     }
5125a83710eSEric Fiselier #endif  // _LIBCPP_HAS_NO_VARIADICS
5135a83710eSEric Fiselier }
514