15a83710eSEric Fiselier //===----------------------------------------------------------------------===//
25a83710eSEric Fiselier //
357b08b09SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
457b08b09SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
557b08b09SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
65a83710eSEric Fiselier //
75a83710eSEric Fiselier //===----------------------------------------------------------------------===//
85a83710eSEric Fiselier //
9*a7f9895cSLouis Dionne // UNSUPPORTED: no-threads
105a83710eSEric Fiselier
115a83710eSEric Fiselier // <mutex>
125a83710eSEric Fiselier
135a83710eSEric Fiselier // template <class L1, class L2, class... L3>
145a83710eSEric Fiselier // int try_lock(L1&, L2&, L3&...);
155a83710eSEric Fiselier
165a83710eSEric Fiselier #include <mutex>
175a83710eSEric Fiselier #include <cassert>
185a83710eSEric Fiselier
1960d6ef63SRoger Ferrer Ibanez #include "test_macros.h"
2060d6ef63SRoger Ferrer Ibanez
215a83710eSEric Fiselier class L0
225a83710eSEric Fiselier {
235a83710eSEric Fiselier bool locked_;
245a83710eSEric Fiselier
255a83710eSEric Fiselier public:
L0()265a83710eSEric Fiselier L0() : locked_(false) {}
275a83710eSEric Fiselier
try_lock()285a83710eSEric Fiselier bool try_lock()
295a83710eSEric Fiselier {
305a83710eSEric Fiselier locked_ = true;
315a83710eSEric Fiselier return locked_;
325a83710eSEric Fiselier }
335a83710eSEric Fiselier
unlock()345a83710eSEric Fiselier void unlock() {locked_ = false;}
355a83710eSEric Fiselier
locked() const365a83710eSEric Fiselier bool locked() const {return locked_;}
375a83710eSEric Fiselier };
385a83710eSEric Fiselier
395a83710eSEric Fiselier class L1
405a83710eSEric Fiselier {
415a83710eSEric Fiselier bool locked_;
425a83710eSEric Fiselier
435a83710eSEric Fiselier public:
L1()445a83710eSEric Fiselier L1() : locked_(false) {}
455a83710eSEric Fiselier
try_lock()465a83710eSEric Fiselier bool try_lock()
475a83710eSEric Fiselier {
485a83710eSEric Fiselier locked_ = false;
495a83710eSEric Fiselier return locked_;
505a83710eSEric Fiselier }
515a83710eSEric Fiselier
unlock()525a83710eSEric Fiselier void unlock() {locked_ = false;}
535a83710eSEric Fiselier
locked() const545a83710eSEric Fiselier bool locked() const {return locked_;}
555a83710eSEric Fiselier };
565a83710eSEric Fiselier
575a83710eSEric Fiselier class L2
585a83710eSEric Fiselier {
595a83710eSEric Fiselier bool locked_;
605a83710eSEric Fiselier
615a83710eSEric Fiselier public:
L2()625a83710eSEric Fiselier L2() : locked_(false) {}
635a83710eSEric Fiselier
try_lock()645a83710eSEric Fiselier bool try_lock()
655a83710eSEric Fiselier {
6660d6ef63SRoger Ferrer Ibanez TEST_THROW(1);
675a83710eSEric Fiselier return locked_;
685a83710eSEric Fiselier }
695a83710eSEric Fiselier
unlock()705a83710eSEric Fiselier void unlock() {locked_ = false;}
715a83710eSEric Fiselier
locked() const725a83710eSEric Fiselier bool locked() const {return locked_;}
735a83710eSEric Fiselier };
745a83710eSEric Fiselier
main(int,char **)752df59c50SJF Bastien int main(int, char**)
765a83710eSEric Fiselier {
775a83710eSEric Fiselier {
785a83710eSEric Fiselier L0 l0;
795a83710eSEric Fiselier L0 l1;
805a83710eSEric Fiselier assert(std::try_lock(l0, l1) == -1);
815a83710eSEric Fiselier assert(l0.locked());
825a83710eSEric Fiselier assert(l1.locked());
835a83710eSEric Fiselier }
845a83710eSEric Fiselier {
855a83710eSEric Fiselier L0 l0;
865a83710eSEric Fiselier L1 l1;
875a83710eSEric Fiselier assert(std::try_lock(l0, l1) == 1);
885a83710eSEric Fiselier assert(!l0.locked());
895a83710eSEric Fiselier assert(!l1.locked());
905a83710eSEric Fiselier }
915a83710eSEric Fiselier {
925a83710eSEric Fiselier L1 l0;
935a83710eSEric Fiselier L0 l1;
945a83710eSEric Fiselier assert(std::try_lock(l0, l1) == 0);
955a83710eSEric Fiselier assert(!l0.locked());
965a83710eSEric Fiselier assert(!l1.locked());
975a83710eSEric Fiselier }
9860d6ef63SRoger Ferrer Ibanez #ifndef TEST_HAS_NO_EXCEPTIONS
995a83710eSEric Fiselier {
1005a83710eSEric Fiselier L0 l0;
1015a83710eSEric Fiselier L2 l1;
1025a83710eSEric Fiselier try
1035a83710eSEric Fiselier {
1041c240a89SBilly Robert O'Neal III (void)std::try_lock(l0, l1);
1055a83710eSEric Fiselier assert(false);
1065a83710eSEric Fiselier }
1075a83710eSEric Fiselier catch (int)
1085a83710eSEric Fiselier {
1095a83710eSEric Fiselier assert(!l0.locked());
1105a83710eSEric Fiselier assert(!l1.locked());
1115a83710eSEric Fiselier }
1125a83710eSEric Fiselier }
1135a83710eSEric Fiselier {
1145a83710eSEric Fiselier L2 l0;
1155a83710eSEric Fiselier L0 l1;
1165a83710eSEric Fiselier try
1175a83710eSEric Fiselier {
1181c240a89SBilly Robert O'Neal III (void)std::try_lock(l0, l1);
1195a83710eSEric Fiselier assert(false);
1205a83710eSEric Fiselier }
1215a83710eSEric Fiselier catch (int)
1225a83710eSEric Fiselier {
1235a83710eSEric Fiselier assert(!l0.locked());
1245a83710eSEric Fiselier assert(!l1.locked());
1255a83710eSEric Fiselier }
1265a83710eSEric Fiselier }
12760d6ef63SRoger Ferrer Ibanez #endif
128e11fb13bSEric Fiselier #if TEST_STD_VER >= 11
1295a83710eSEric Fiselier {
1305a83710eSEric Fiselier L0 l0;
1315a83710eSEric Fiselier L0 l1;
1325a83710eSEric Fiselier L0 l2;
1335a83710eSEric Fiselier assert(std::try_lock(l0, l1, l2) == -1);
1345a83710eSEric Fiselier assert(l0.locked());
1355a83710eSEric Fiselier assert(l1.locked());
1365a83710eSEric Fiselier assert(l2.locked());
1375a83710eSEric Fiselier }
1385a83710eSEric Fiselier {
1395a83710eSEric Fiselier L1 l0;
1405a83710eSEric Fiselier L1 l1;
1415a83710eSEric Fiselier L1 l2;
1425a83710eSEric Fiselier assert(std::try_lock(l0, l1, l2) == 0);
1435a83710eSEric Fiselier assert(!l0.locked());
1445a83710eSEric Fiselier assert(!l1.locked());
1455a83710eSEric Fiselier assert(!l2.locked());
1465a83710eSEric Fiselier }
14760d6ef63SRoger Ferrer Ibanez #ifndef TEST_HAS_NO_EXCEPTIONS
1485a83710eSEric Fiselier {
1495a83710eSEric Fiselier L2 l0;
1505a83710eSEric Fiselier L2 l1;
1515a83710eSEric Fiselier L2 l2;
1525a83710eSEric Fiselier try
1535a83710eSEric Fiselier {
1541c240a89SBilly Robert O'Neal III (void)std::try_lock(l0, l1, l2);
1555a83710eSEric Fiselier assert(false);
1565a83710eSEric Fiselier }
1575a83710eSEric Fiselier catch (int)
1585a83710eSEric Fiselier {
1595a83710eSEric Fiselier assert(!l0.locked());
1605a83710eSEric Fiselier assert(!l1.locked());
1615a83710eSEric Fiselier assert(!l2.locked());
1625a83710eSEric Fiselier }
1635a83710eSEric Fiselier }
1645a83710eSEric Fiselier {
1655a83710eSEric Fiselier L0 l0;
1665a83710eSEric Fiselier L1 l1;
1675a83710eSEric Fiselier L2 l2;
1685a83710eSEric Fiselier assert(std::try_lock(l0, l1, l2) == 1);
1695a83710eSEric Fiselier assert(!l0.locked());
1705a83710eSEric Fiselier assert(!l1.locked());
1715a83710eSEric Fiselier assert(!l2.locked());
1725a83710eSEric Fiselier }
17360d6ef63SRoger Ferrer Ibanez #endif
1745a83710eSEric Fiselier {
1755a83710eSEric Fiselier L0 l0;
1765a83710eSEric Fiselier L0 l1;
1775a83710eSEric Fiselier L1 l2;
1785a83710eSEric Fiselier assert(std::try_lock(l0, l1, l2) == 2);
1795a83710eSEric Fiselier assert(!l0.locked());
1805a83710eSEric Fiselier assert(!l1.locked());
1815a83710eSEric Fiselier assert(!l2.locked());
1825a83710eSEric Fiselier }
1835a83710eSEric Fiselier {
1845a83710eSEric Fiselier L0 l0;
1855a83710eSEric Fiselier L1 l1;
1865a83710eSEric Fiselier L0 l2;
1875a83710eSEric Fiselier assert(std::try_lock(l0, l1, l2) == 1);
1885a83710eSEric Fiselier assert(!l0.locked());
1895a83710eSEric Fiselier assert(!l1.locked());
1905a83710eSEric Fiselier assert(!l2.locked());
1915a83710eSEric Fiselier }
1925a83710eSEric Fiselier {
1935a83710eSEric Fiselier L1 l0;
1945a83710eSEric Fiselier L0 l1;
1955a83710eSEric Fiselier L0 l2;
1965a83710eSEric Fiselier assert(std::try_lock(l0, l1, l2) == 0);
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 L0 l0;
2045a83710eSEric Fiselier L0 l1;
2055a83710eSEric Fiselier L2 l2;
2065a83710eSEric Fiselier try
2075a83710eSEric Fiselier {
2081c240a89SBilly Robert O'Neal III (void)std::try_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 }
2185a83710eSEric Fiselier {
2195a83710eSEric Fiselier L0 l0;
2205a83710eSEric Fiselier L2 l1;
2215a83710eSEric Fiselier L0 l2;
2225a83710eSEric Fiselier try
2235a83710eSEric Fiselier {
2241c240a89SBilly Robert O'Neal III (void)std::try_lock(l0, l1, l2);
2255a83710eSEric Fiselier assert(false);
2265a83710eSEric Fiselier }
2275a83710eSEric Fiselier catch (int)
2285a83710eSEric Fiselier {
2295a83710eSEric Fiselier assert(!l0.locked());
2305a83710eSEric Fiselier assert(!l1.locked());
2315a83710eSEric Fiselier assert(!l2.locked());
2325a83710eSEric Fiselier }
2335a83710eSEric Fiselier }
2345a83710eSEric Fiselier {
2355a83710eSEric Fiselier L2 l0;
2365a83710eSEric Fiselier L0 l1;
2375a83710eSEric Fiselier L0 l2;
2385a83710eSEric Fiselier try
2395a83710eSEric Fiselier {
2401c240a89SBilly Robert O'Neal III (void)std::try_lock(l0, l1, l2);
2415a83710eSEric Fiselier assert(false);
2425a83710eSEric Fiselier }
2435a83710eSEric Fiselier catch (int)
2445a83710eSEric Fiselier {
2455a83710eSEric Fiselier assert(!l0.locked());
2465a83710eSEric Fiselier assert(!l1.locked());
2475a83710eSEric Fiselier assert(!l2.locked());
2485a83710eSEric Fiselier }
2495a83710eSEric Fiselier }
25060d6ef63SRoger Ferrer Ibanez #endif
2515a83710eSEric Fiselier {
2525a83710eSEric Fiselier L1 l0;
2535a83710eSEric Fiselier L1 l1;
2545a83710eSEric Fiselier L0 l2;
2555a83710eSEric Fiselier assert(std::try_lock(l0, l1, l2) == 0);
2565a83710eSEric Fiselier assert(!l0.locked());
2575a83710eSEric Fiselier assert(!l1.locked());
2585a83710eSEric Fiselier assert(!l2.locked());
2595a83710eSEric Fiselier }
2605a83710eSEric Fiselier {
2615a83710eSEric Fiselier L1 l0;
2625a83710eSEric Fiselier L0 l1;
2635a83710eSEric Fiselier L1 l2;
2645a83710eSEric Fiselier assert(std::try_lock(l0, l1, l2) == 0);
2655a83710eSEric Fiselier assert(!l0.locked());
2665a83710eSEric Fiselier assert(!l1.locked());
2675a83710eSEric Fiselier assert(!l2.locked());
2685a83710eSEric Fiselier }
2695a83710eSEric Fiselier {
2705a83710eSEric Fiselier L0 l0;
2715a83710eSEric Fiselier L1 l1;
2725a83710eSEric Fiselier L1 l2;
2735a83710eSEric Fiselier assert(std::try_lock(l0, l1, l2) == 1);
2745a83710eSEric Fiselier assert(!l0.locked());
2755a83710eSEric Fiselier assert(!l1.locked());
2765a83710eSEric Fiselier assert(!l2.locked());
2775a83710eSEric Fiselier }
27860d6ef63SRoger Ferrer Ibanez #ifndef TEST_HAS_NO_EXCEPTIONS
2795a83710eSEric Fiselier {
2805a83710eSEric Fiselier L1 l0;
2815a83710eSEric Fiselier L1 l1;
2825a83710eSEric Fiselier L2 l2;
2835a83710eSEric Fiselier assert(std::try_lock(l0, l1, l2) == 0);
2845a83710eSEric Fiselier assert(!l0.locked());
2855a83710eSEric Fiselier assert(!l1.locked());
2865a83710eSEric Fiselier assert(!l2.locked());
2875a83710eSEric Fiselier }
2885a83710eSEric Fiselier {
2895a83710eSEric Fiselier L1 l0;
2905a83710eSEric Fiselier L2 l1;
2915a83710eSEric Fiselier L1 l2;
2925a83710eSEric Fiselier assert(std::try_lock(l0, l1, l2) == 0);
2935a83710eSEric Fiselier assert(!l0.locked());
2945a83710eSEric Fiselier assert(!l1.locked());
2955a83710eSEric Fiselier assert(!l2.locked());
2965a83710eSEric Fiselier }
2975a83710eSEric Fiselier {
2985a83710eSEric Fiselier L2 l0;
2995a83710eSEric Fiselier L1 l1;
3005a83710eSEric Fiselier L1 l2;
3015a83710eSEric Fiselier try
3025a83710eSEric Fiselier {
3031c240a89SBilly Robert O'Neal III (void)std::try_lock(l0, l1, l2);
3045a83710eSEric Fiselier assert(false);
3055a83710eSEric Fiselier }
3065a83710eSEric Fiselier catch (int)
3075a83710eSEric Fiselier {
3085a83710eSEric Fiselier assert(!l0.locked());
3095a83710eSEric Fiselier assert(!l1.locked());
3105a83710eSEric Fiselier assert(!l2.locked());
3115a83710eSEric Fiselier }
3125a83710eSEric Fiselier }
3135a83710eSEric Fiselier {
3145a83710eSEric Fiselier L2 l0;
3155a83710eSEric Fiselier L2 l1;
3165a83710eSEric Fiselier L0 l2;
3175a83710eSEric Fiselier try
3185a83710eSEric Fiselier {
3191c240a89SBilly Robert O'Neal III (void)std::try_lock(l0, l1, l2);
3205a83710eSEric Fiselier assert(false);
3215a83710eSEric Fiselier }
3225a83710eSEric Fiselier catch (int)
3235a83710eSEric Fiselier {
3245a83710eSEric Fiselier assert(!l0.locked());
3255a83710eSEric Fiselier assert(!l1.locked());
3265a83710eSEric Fiselier assert(!l2.locked());
3275a83710eSEric Fiselier }
3285a83710eSEric Fiselier }
3295a83710eSEric Fiselier {
3305a83710eSEric Fiselier L2 l0;
3315a83710eSEric Fiselier L0 l1;
3325a83710eSEric Fiselier L2 l2;
3335a83710eSEric Fiselier try
3345a83710eSEric Fiselier {
3351c240a89SBilly Robert O'Neal III (void)std::try_lock(l0, l1, l2);
3365a83710eSEric Fiselier assert(false);
3375a83710eSEric Fiselier }
3385a83710eSEric Fiselier catch (int)
3395a83710eSEric Fiselier {
3405a83710eSEric Fiselier assert(!l0.locked());
3415a83710eSEric Fiselier assert(!l1.locked());
3425a83710eSEric Fiselier assert(!l2.locked());
3435a83710eSEric Fiselier }
3445a83710eSEric Fiselier }
3455a83710eSEric Fiselier {
3465a83710eSEric Fiselier L0 l0;
3475a83710eSEric Fiselier L2 l1;
3485a83710eSEric Fiselier L2 l2;
3495a83710eSEric Fiselier try
3505a83710eSEric Fiselier {
3511c240a89SBilly Robert O'Neal III (void)std::try_lock(l0, l1, l2);
3525a83710eSEric Fiselier assert(false);
3535a83710eSEric Fiselier }
3545a83710eSEric Fiselier catch (int)
3555a83710eSEric Fiselier {
3565a83710eSEric Fiselier assert(!l0.locked());
3575a83710eSEric Fiselier assert(!l1.locked());
3585a83710eSEric Fiselier assert(!l2.locked());
3595a83710eSEric Fiselier }
3605a83710eSEric Fiselier }
3615a83710eSEric Fiselier {
3625a83710eSEric Fiselier L2 l0;
3635a83710eSEric Fiselier L2 l1;
3645a83710eSEric Fiselier L1 l2;
3655a83710eSEric Fiselier try
3665a83710eSEric Fiselier {
3671c240a89SBilly Robert O'Neal III (void)std::try_lock(l0, l1, l2);
3685a83710eSEric Fiselier assert(false);
3695a83710eSEric Fiselier }
3705a83710eSEric Fiselier catch (int)
3715a83710eSEric Fiselier {
3725a83710eSEric Fiselier assert(!l0.locked());
3735a83710eSEric Fiselier assert(!l1.locked());
3745a83710eSEric Fiselier assert(!l2.locked());
3755a83710eSEric Fiselier }
3765a83710eSEric Fiselier }
3775a83710eSEric Fiselier {
3785a83710eSEric Fiselier L2 l0;
3795a83710eSEric Fiselier L1 l1;
3805a83710eSEric Fiselier L2 l2;
3815a83710eSEric Fiselier try
3825a83710eSEric Fiselier {
3831c240a89SBilly Robert O'Neal III (void)std::try_lock(l0, l1, l2);
3845a83710eSEric Fiselier assert(false);
3855a83710eSEric Fiselier }
3865a83710eSEric Fiselier catch (int)
3875a83710eSEric Fiselier {
3885a83710eSEric Fiselier assert(!l0.locked());
3895a83710eSEric Fiselier assert(!l1.locked());
3905a83710eSEric Fiselier assert(!l2.locked());
3915a83710eSEric Fiselier }
3925a83710eSEric Fiselier }
3935a83710eSEric Fiselier {
3945a83710eSEric Fiselier L1 l0;
3955a83710eSEric Fiselier L2 l1;
3965a83710eSEric Fiselier L2 l2;
3975a83710eSEric Fiselier assert(std::try_lock(l0, l1, l2) == 0);
3985a83710eSEric Fiselier assert(!l0.locked());
3995a83710eSEric Fiselier assert(!l1.locked());
4005a83710eSEric Fiselier assert(!l2.locked());
4015a83710eSEric Fiselier }
4025a83710eSEric Fiselier {
4035a83710eSEric Fiselier L0 l0;
4045a83710eSEric Fiselier L2 l1;
4055a83710eSEric Fiselier L1 l2;
4065a83710eSEric Fiselier try
4075a83710eSEric Fiselier {
4081c240a89SBilly Robert O'Neal III (void)std::try_lock(l0, l1, l2);
4095a83710eSEric Fiselier assert(false);
4105a83710eSEric Fiselier }
4115a83710eSEric Fiselier catch (int)
4125a83710eSEric Fiselier {
4135a83710eSEric Fiselier assert(!l0.locked());
4145a83710eSEric Fiselier assert(!l1.locked());
4155a83710eSEric Fiselier assert(!l2.locked());
4165a83710eSEric Fiselier }
4175a83710eSEric Fiselier }
4185a83710eSEric Fiselier {
4195a83710eSEric Fiselier L1 l0;
4205a83710eSEric Fiselier L0 l1;
4215a83710eSEric Fiselier L2 l2;
4225a83710eSEric Fiselier assert(std::try_lock(l0, l1, l2) == 0);
4235a83710eSEric Fiselier assert(!l0.locked());
4245a83710eSEric Fiselier assert(!l1.locked());
4255a83710eSEric Fiselier assert(!l2.locked());
4265a83710eSEric Fiselier }
4275a83710eSEric Fiselier {
4285a83710eSEric Fiselier L1 l0;
4295a83710eSEric Fiselier L2 l1;
4305a83710eSEric Fiselier L0 l2;
4315a83710eSEric Fiselier assert(std::try_lock(l0, l1, l2) == 0);
4325a83710eSEric Fiselier assert(!l0.locked());
4335a83710eSEric Fiselier assert(!l1.locked());
4345a83710eSEric Fiselier assert(!l2.locked());
4355a83710eSEric Fiselier }
4365a83710eSEric Fiselier {
4375a83710eSEric Fiselier L2 l0;
4385a83710eSEric Fiselier L0 l1;
4395a83710eSEric Fiselier L1 l2;
4405a83710eSEric Fiselier try
4415a83710eSEric Fiselier {
4421c240a89SBilly Robert O'Neal III (void)std::try_lock(l0, l1, l2);
4435a83710eSEric Fiselier assert(false);
4445a83710eSEric Fiselier }
4455a83710eSEric Fiselier catch (int)
4465a83710eSEric Fiselier {
4475a83710eSEric Fiselier assert(!l0.locked());
4485a83710eSEric Fiselier assert(!l1.locked());
4495a83710eSEric Fiselier assert(!l2.locked());
4505a83710eSEric Fiselier }
4515a83710eSEric Fiselier }
4525a83710eSEric Fiselier {
4535a83710eSEric Fiselier L2 l0;
4545a83710eSEric Fiselier L1 l1;
4555a83710eSEric Fiselier L0 l2;
4565a83710eSEric Fiselier try
4575a83710eSEric Fiselier {
4581c240a89SBilly Robert O'Neal III (void)std::try_lock(l0, l1, l2);
4595a83710eSEric Fiselier assert(false);
4605a83710eSEric Fiselier }
4615a83710eSEric Fiselier catch (int)
4625a83710eSEric Fiselier {
4635a83710eSEric Fiselier assert(!l0.locked());
4645a83710eSEric Fiselier assert(!l1.locked());
4655a83710eSEric Fiselier assert(!l2.locked());
4665a83710eSEric Fiselier }
4675a83710eSEric Fiselier }
46860d6ef63SRoger Ferrer Ibanez #endif // TEST_HAS_NO_EXCEPTIONS
4695a83710eSEric Fiselier {
4705a83710eSEric Fiselier L0 l0;
4715a83710eSEric Fiselier L0 l1;
4725a83710eSEric Fiselier L0 l2;
4735a83710eSEric Fiselier L0 l3;
4745a83710eSEric Fiselier assert(std::try_lock(l0, l1, l2, l3) == -1);
4755a83710eSEric Fiselier assert(l0.locked());
4765a83710eSEric Fiselier assert(l1.locked());
4775a83710eSEric Fiselier assert(l2.locked());
4785a83710eSEric Fiselier assert(l3.locked());
4795a83710eSEric Fiselier }
4805a83710eSEric Fiselier {
4815a83710eSEric Fiselier L1 l0;
4825a83710eSEric Fiselier L0 l1;
4835a83710eSEric Fiselier L0 l2;
4845a83710eSEric Fiselier L0 l3;
4855a83710eSEric Fiselier assert(std::try_lock(l0, l1, l2, l3) == 0);
4865a83710eSEric Fiselier assert(!l0.locked());
4875a83710eSEric Fiselier assert(!l1.locked());
4885a83710eSEric Fiselier assert(!l2.locked());
4895a83710eSEric Fiselier assert(!l3.locked());
4905a83710eSEric Fiselier }
4915a83710eSEric Fiselier {
4925a83710eSEric Fiselier L0 l0;
4935a83710eSEric Fiselier L1 l1;
4945a83710eSEric Fiselier L0 l2;
4955a83710eSEric Fiselier L0 l3;
4965a83710eSEric Fiselier assert(std::try_lock(l0, l1, l2, l3) == 1);
4975a83710eSEric Fiselier assert(!l0.locked());
4985a83710eSEric Fiselier assert(!l1.locked());
4995a83710eSEric Fiselier assert(!l2.locked());
5005a83710eSEric Fiselier assert(!l3.locked());
5015a83710eSEric Fiselier }
5025a83710eSEric Fiselier {
5035a83710eSEric Fiselier L0 l0;
5045a83710eSEric Fiselier L0 l1;
5055a83710eSEric Fiselier L1 l2;
5065a83710eSEric Fiselier L0 l3;
5075a83710eSEric Fiselier assert(std::try_lock(l0, l1, l2, l3) == 2);
5085a83710eSEric Fiselier assert(!l0.locked());
5095a83710eSEric Fiselier assert(!l1.locked());
5105a83710eSEric Fiselier assert(!l2.locked());
5115a83710eSEric Fiselier assert(!l3.locked());
5125a83710eSEric Fiselier }
5135a83710eSEric Fiselier {
5145a83710eSEric Fiselier L0 l0;
5155a83710eSEric Fiselier L0 l1;
5165a83710eSEric Fiselier L0 l2;
5175a83710eSEric Fiselier L1 l3;
5185a83710eSEric Fiselier assert(std::try_lock(l0, l1, l2, l3) == 3);
5195a83710eSEric Fiselier assert(!l0.locked());
5205a83710eSEric Fiselier assert(!l1.locked());
5215a83710eSEric Fiselier assert(!l2.locked());
5225a83710eSEric Fiselier assert(!l3.locked());
5235a83710eSEric Fiselier }
524e11fb13bSEric Fiselier #endif // TEST_STD_VER >= 11
5252df59c50SJF Bastien
5262df59c50SJF Bastien return 0;
5275a83710eSEric Fiselier }
528