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