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 // 95a83710eSEric Fiselier // UNSUPPORTED: libcpp-has-no-threads 105a83710eSEric Fiselier 11*8a21e0c1SArthur O'Dwyer // This test hangs forever when built against libstdc++ (Oct 2016). 12*8a21e0c1SArthur O'Dwyer // UNSUPPORTED: stdlib=libstdc++ 13*8a21e0c1SArthur O'Dwyer 14*8a21e0c1SArthur O'Dwyer // This test isn't quite standards-conforming: it's testing our specific 15*8a21e0c1SArthur O'Dwyer // algorithm, where when lx.try_lock() fails we start the next attempt 16*8a21e0c1SArthur O'Dwyer // with an unconditional lx.lock(). Thus our algorithm can handle a list 17*8a21e0c1SArthur O'Dwyer // of mutexes where at-most-one of them is of the evil type `class L1`, 18*8a21e0c1SArthur O'Dwyer // but will loop forever if two or more of them are `class L1`. 1976e316f9SEric Fiselier 205a83710eSEric Fiselier // <mutex> 215a83710eSEric Fiselier 225a83710eSEric Fiselier // template <class L1, class L2, class... L3> 235a83710eSEric Fiselier // void lock(L1&, L2&, L3&...); 245a83710eSEric Fiselier 255a83710eSEric Fiselier #include <mutex> 265a83710eSEric Fiselier #include <cassert> 275a83710eSEric Fiselier 2860d6ef63SRoger Ferrer Ibanez #include "test_macros.h" 2960d6ef63SRoger Ferrer Ibanez 305a83710eSEric Fiselier class L0 315a83710eSEric Fiselier { 325a83710eSEric Fiselier bool locked_; 335a83710eSEric Fiselier 345a83710eSEric Fiselier public: 355a83710eSEric Fiselier L0() : locked_(false) {} 365a83710eSEric Fiselier 375a83710eSEric Fiselier void lock() 385a83710eSEric Fiselier { 395a83710eSEric Fiselier locked_ = true; 405a83710eSEric Fiselier } 415a83710eSEric Fiselier 425a83710eSEric Fiselier bool try_lock() 435a83710eSEric Fiselier { 445a83710eSEric Fiselier locked_ = true; 455a83710eSEric Fiselier return locked_; 465a83710eSEric Fiselier } 475a83710eSEric Fiselier 485a83710eSEric Fiselier void unlock() {locked_ = false;} 495a83710eSEric Fiselier 505a83710eSEric Fiselier bool locked() const {return locked_;} 515a83710eSEric Fiselier }; 525a83710eSEric Fiselier 535a83710eSEric Fiselier class L1 545a83710eSEric Fiselier { 555a83710eSEric Fiselier bool locked_; 565a83710eSEric Fiselier 575a83710eSEric Fiselier public: 585a83710eSEric Fiselier L1() : locked_(false) {} 595a83710eSEric Fiselier 605a83710eSEric Fiselier void lock() 615a83710eSEric Fiselier { 625a83710eSEric Fiselier locked_ = true; 635a83710eSEric Fiselier } 645a83710eSEric Fiselier 655a83710eSEric Fiselier bool try_lock() 665a83710eSEric Fiselier { 675a83710eSEric Fiselier locked_ = false; 685a83710eSEric Fiselier return locked_; 695a83710eSEric Fiselier } 705a83710eSEric Fiselier 715a83710eSEric Fiselier void unlock() {locked_ = false;} 725a83710eSEric Fiselier 735a83710eSEric Fiselier bool locked() const {return locked_;} 745a83710eSEric Fiselier }; 755a83710eSEric Fiselier 765a83710eSEric Fiselier class L2 775a83710eSEric Fiselier { 785a83710eSEric Fiselier bool locked_; 795a83710eSEric Fiselier 805a83710eSEric Fiselier public: 815a83710eSEric Fiselier L2() : locked_(false) {} 825a83710eSEric Fiselier 835a83710eSEric Fiselier void lock() 845a83710eSEric Fiselier { 8560d6ef63SRoger Ferrer Ibanez TEST_THROW(1); 865a83710eSEric Fiselier } 875a83710eSEric Fiselier 885a83710eSEric Fiselier bool try_lock() 895a83710eSEric Fiselier { 9060d6ef63SRoger Ferrer Ibanez TEST_THROW(1); 915a83710eSEric Fiselier return locked_; 925a83710eSEric Fiselier } 935a83710eSEric Fiselier 945a83710eSEric Fiselier void unlock() {locked_ = false;} 955a83710eSEric Fiselier 965a83710eSEric Fiselier bool locked() const {return locked_;} 975a83710eSEric Fiselier }; 985a83710eSEric Fiselier 992df59c50SJF Bastien int main(int, char**) 1005a83710eSEric Fiselier { 1015a83710eSEric Fiselier { 1025a83710eSEric Fiselier L0 l0; 1035a83710eSEric Fiselier L0 l1; 1045a83710eSEric Fiselier std::lock(l0, l1); 1055a83710eSEric Fiselier assert(l0.locked()); 1065a83710eSEric Fiselier assert(l1.locked()); 1075a83710eSEric Fiselier } 1085a83710eSEric Fiselier { 1095a83710eSEric Fiselier L0 l0; 1105a83710eSEric Fiselier L1 l1; 1115a83710eSEric Fiselier std::lock(l0, l1); 1125a83710eSEric Fiselier assert(l0.locked()); 1135a83710eSEric Fiselier assert(l1.locked()); 1145a83710eSEric Fiselier } 1155a83710eSEric Fiselier { 1165a83710eSEric Fiselier L1 l0; 1175a83710eSEric Fiselier L0 l1; 1185a83710eSEric Fiselier std::lock(l0, l1); 1195a83710eSEric Fiselier assert(l0.locked()); 1205a83710eSEric Fiselier assert(l1.locked()); 1215a83710eSEric Fiselier } 12260d6ef63SRoger Ferrer Ibanez #ifndef TEST_HAS_NO_EXCEPTIONS 1235a83710eSEric Fiselier { 1245a83710eSEric Fiselier L0 l0; 1255a83710eSEric Fiselier L2 l1; 1265a83710eSEric Fiselier try 1275a83710eSEric Fiselier { 1285a83710eSEric Fiselier std::lock(l0, l1); 1295a83710eSEric Fiselier assert(false); 1305a83710eSEric Fiselier } 1315a83710eSEric Fiselier catch (int) 1325a83710eSEric Fiselier { 1335a83710eSEric Fiselier assert(!l0.locked()); 1345a83710eSEric Fiselier assert(!l1.locked()); 1355a83710eSEric Fiselier } 1365a83710eSEric Fiselier } 1375a83710eSEric Fiselier { 1385a83710eSEric Fiselier L2 l0; 1395a83710eSEric Fiselier L0 l1; 1405a83710eSEric Fiselier try 1415a83710eSEric Fiselier { 1425a83710eSEric Fiselier std::lock(l0, l1); 1435a83710eSEric Fiselier assert(false); 1445a83710eSEric Fiselier } 1455a83710eSEric Fiselier catch (int) 1465a83710eSEric Fiselier { 1475a83710eSEric Fiselier assert(!l0.locked()); 1485a83710eSEric Fiselier assert(!l1.locked()); 1495a83710eSEric Fiselier } 1505a83710eSEric Fiselier } 1515a83710eSEric Fiselier { 1525a83710eSEric Fiselier L1 l0; 1535a83710eSEric Fiselier L2 l1; 1545a83710eSEric Fiselier try 1555a83710eSEric Fiselier { 1565a83710eSEric Fiselier std::lock(l0, l1); 1575a83710eSEric Fiselier assert(false); 1585a83710eSEric Fiselier } 1595a83710eSEric Fiselier catch (int) 1605a83710eSEric Fiselier { 1615a83710eSEric Fiselier assert(!l0.locked()); 1625a83710eSEric Fiselier assert(!l1.locked()); 1635a83710eSEric Fiselier } 1645a83710eSEric Fiselier } 1655a83710eSEric Fiselier { 1665a83710eSEric Fiselier L2 l0; 1675a83710eSEric Fiselier L1 l1; 1685a83710eSEric Fiselier try 1695a83710eSEric Fiselier { 1705a83710eSEric Fiselier std::lock(l0, l1); 1715a83710eSEric Fiselier assert(false); 1725a83710eSEric Fiselier } 1735a83710eSEric Fiselier catch (int) 1745a83710eSEric Fiselier { 1755a83710eSEric Fiselier assert(!l0.locked()); 1765a83710eSEric Fiselier assert(!l1.locked()); 1775a83710eSEric Fiselier } 1785a83710eSEric Fiselier } 1795a83710eSEric Fiselier { 1805a83710eSEric Fiselier L2 l0; 1815a83710eSEric Fiselier L2 l1; 1825a83710eSEric Fiselier try 1835a83710eSEric Fiselier { 1845a83710eSEric Fiselier std::lock(l0, l1); 1855a83710eSEric Fiselier assert(false); 1865a83710eSEric Fiselier } 1875a83710eSEric Fiselier catch (int) 1885a83710eSEric Fiselier { 1895a83710eSEric Fiselier assert(!l0.locked()); 1905a83710eSEric Fiselier assert(!l1.locked()); 1915a83710eSEric Fiselier } 1925a83710eSEric Fiselier } 19360d6ef63SRoger Ferrer Ibanez #endif 194e11fb13bSEric Fiselier #if TEST_STD_VER >= 11 1955a83710eSEric Fiselier { 1965a83710eSEric Fiselier L0 l0; 1975a83710eSEric Fiselier L0 l1; 1985a83710eSEric Fiselier L0 l2; 1995a83710eSEric Fiselier std::lock(l0, l1, l2); 2005a83710eSEric Fiselier assert(l0.locked()); 2015a83710eSEric Fiselier assert(l1.locked()); 2025a83710eSEric Fiselier assert(l2.locked()); 2035a83710eSEric Fiselier } 20460d6ef63SRoger Ferrer Ibanez #ifndef TEST_HAS_NO_EXCEPTIONS 2055a83710eSEric Fiselier { 2065a83710eSEric Fiselier L2 l0; 2075a83710eSEric Fiselier L2 l1; 2085a83710eSEric Fiselier L2 l2; 2095a83710eSEric Fiselier try 2105a83710eSEric Fiselier { 2115a83710eSEric Fiselier std::lock(l0, l1, l2); 2125a83710eSEric Fiselier assert(false); 2135a83710eSEric Fiselier } 2145a83710eSEric Fiselier catch (int) 2155a83710eSEric Fiselier { 2165a83710eSEric Fiselier assert(!l0.locked()); 2175a83710eSEric Fiselier assert(!l1.locked()); 2185a83710eSEric Fiselier assert(!l2.locked()); 2195a83710eSEric Fiselier } 2205a83710eSEric Fiselier } 22160d6ef63SRoger Ferrer Ibanez #endif 2225a83710eSEric Fiselier { 2235a83710eSEric Fiselier L0 l0; 2245a83710eSEric Fiselier L0 l1; 2255a83710eSEric Fiselier L1 l2; 2265a83710eSEric Fiselier std::lock(l0, l1, l2); 2275a83710eSEric Fiselier assert(l0.locked()); 2285a83710eSEric Fiselier assert(l1.locked()); 2295a83710eSEric Fiselier assert(l2.locked()); 2305a83710eSEric Fiselier } 2315a83710eSEric Fiselier { 2325a83710eSEric Fiselier L0 l0; 2335a83710eSEric Fiselier L1 l1; 2345a83710eSEric Fiselier L0 l2; 2355a83710eSEric Fiselier std::lock(l0, l1, l2); 2365a83710eSEric Fiselier assert(l0.locked()); 2375a83710eSEric Fiselier assert(l1.locked()); 2385a83710eSEric Fiselier assert(l2.locked()); 2395a83710eSEric Fiselier } 2405a83710eSEric Fiselier { 2415a83710eSEric Fiselier L1 l0; 2425a83710eSEric Fiselier L0 l1; 2435a83710eSEric Fiselier L0 l2; 2445a83710eSEric Fiselier std::lock(l0, l1, l2); 2455a83710eSEric Fiselier assert(l0.locked()); 2465a83710eSEric Fiselier assert(l1.locked()); 2475a83710eSEric Fiselier assert(l2.locked()); 2485a83710eSEric Fiselier } 24960d6ef63SRoger Ferrer Ibanez #ifndef TEST_HAS_NO_EXCEPTIONS 2505a83710eSEric Fiselier { 2515a83710eSEric Fiselier L0 l0; 2525a83710eSEric Fiselier L0 l1; 2535a83710eSEric Fiselier L2 l2; 2545a83710eSEric Fiselier try 2555a83710eSEric Fiselier { 2565a83710eSEric Fiselier std::lock(l0, l1, l2); 2575a83710eSEric Fiselier assert(false); 2585a83710eSEric Fiselier } 2595a83710eSEric Fiselier catch (int) 2605a83710eSEric Fiselier { 2615a83710eSEric Fiselier assert(!l0.locked()); 2625a83710eSEric Fiselier assert(!l1.locked()); 2635a83710eSEric Fiselier assert(!l2.locked()); 2645a83710eSEric Fiselier } 2655a83710eSEric Fiselier } 2665a83710eSEric Fiselier { 2675a83710eSEric Fiselier L0 l0; 2685a83710eSEric Fiselier L2 l1; 2695a83710eSEric Fiselier L0 l2; 2705a83710eSEric Fiselier try 2715a83710eSEric Fiselier { 2725a83710eSEric Fiselier std::lock(l0, l1, l2); 2735a83710eSEric Fiselier assert(false); 2745a83710eSEric Fiselier } 2755a83710eSEric Fiselier catch (int) 2765a83710eSEric Fiselier { 2775a83710eSEric Fiselier assert(!l0.locked()); 2785a83710eSEric Fiselier assert(!l1.locked()); 2795a83710eSEric Fiselier assert(!l2.locked()); 2805a83710eSEric Fiselier } 2815a83710eSEric Fiselier } 2825a83710eSEric Fiselier { 2835a83710eSEric Fiselier L2 l0; 2845a83710eSEric Fiselier L0 l1; 2855a83710eSEric Fiselier L0 l2; 2865a83710eSEric Fiselier try 2875a83710eSEric Fiselier { 2885a83710eSEric Fiselier std::lock(l0, l1, l2); 2895a83710eSEric Fiselier assert(false); 2905a83710eSEric Fiselier } 2915a83710eSEric Fiselier catch (int) 2925a83710eSEric Fiselier { 2935a83710eSEric Fiselier assert(!l0.locked()); 2945a83710eSEric Fiselier assert(!l1.locked()); 2955a83710eSEric Fiselier assert(!l2.locked()); 2965a83710eSEric Fiselier } 2975a83710eSEric Fiselier } 2985a83710eSEric Fiselier { 2995a83710eSEric Fiselier L2 l0; 3005a83710eSEric Fiselier L2 l1; 3015a83710eSEric Fiselier L0 l2; 3025a83710eSEric Fiselier try 3035a83710eSEric Fiselier { 3045a83710eSEric Fiselier std::lock(l0, l1, l2); 3055a83710eSEric Fiselier assert(false); 3065a83710eSEric Fiselier } 3075a83710eSEric Fiselier catch (int) 3085a83710eSEric Fiselier { 3095a83710eSEric Fiselier assert(!l0.locked()); 3105a83710eSEric Fiselier assert(!l1.locked()); 3115a83710eSEric Fiselier assert(!l2.locked()); 3125a83710eSEric Fiselier } 3135a83710eSEric Fiselier } 3145a83710eSEric Fiselier { 3155a83710eSEric Fiselier L2 l0; 3165a83710eSEric Fiselier L0 l1; 3175a83710eSEric Fiselier L2 l2; 3185a83710eSEric Fiselier try 3195a83710eSEric Fiselier { 3205a83710eSEric Fiselier std::lock(l0, l1, l2); 3215a83710eSEric Fiselier assert(false); 3225a83710eSEric Fiselier } 3235a83710eSEric Fiselier catch (int) 3245a83710eSEric Fiselier { 3255a83710eSEric Fiselier assert(!l0.locked()); 3265a83710eSEric Fiselier assert(!l1.locked()); 3275a83710eSEric Fiselier assert(!l2.locked()); 3285a83710eSEric Fiselier } 3295a83710eSEric Fiselier } 3305a83710eSEric Fiselier { 3315a83710eSEric Fiselier L0 l0; 3325a83710eSEric Fiselier L2 l1; 3335a83710eSEric Fiselier L2 l2; 3345a83710eSEric Fiselier try 3355a83710eSEric Fiselier { 3365a83710eSEric Fiselier std::lock(l0, l1, l2); 3375a83710eSEric Fiselier assert(false); 3385a83710eSEric Fiselier } 3395a83710eSEric Fiselier catch (int) 3405a83710eSEric Fiselier { 3415a83710eSEric Fiselier assert(!l0.locked()); 3425a83710eSEric Fiselier assert(!l1.locked()); 3435a83710eSEric Fiselier assert(!l2.locked()); 3445a83710eSEric Fiselier } 3455a83710eSEric Fiselier } 3465a83710eSEric Fiselier { 3475a83710eSEric Fiselier L2 l0; 3485a83710eSEric Fiselier L2 l1; 3495a83710eSEric Fiselier L1 l2; 3505a83710eSEric Fiselier try 3515a83710eSEric Fiselier { 3525a83710eSEric Fiselier std::lock(l0, l1, l2); 3535a83710eSEric Fiselier assert(false); 3545a83710eSEric Fiselier } 3555a83710eSEric Fiselier catch (int) 3565a83710eSEric Fiselier { 3575a83710eSEric Fiselier assert(!l0.locked()); 3585a83710eSEric Fiselier assert(!l1.locked()); 3595a83710eSEric Fiselier assert(!l2.locked()); 3605a83710eSEric Fiselier } 3615a83710eSEric Fiselier } 3625a83710eSEric Fiselier { 3635a83710eSEric Fiselier L2 l0; 3645a83710eSEric Fiselier L1 l1; 3655a83710eSEric Fiselier L2 l2; 3665a83710eSEric Fiselier try 3675a83710eSEric Fiselier { 3685a83710eSEric Fiselier std::lock(l0, l1, l2); 3695a83710eSEric Fiselier assert(false); 3705a83710eSEric Fiselier } 3715a83710eSEric Fiselier catch (int) 3725a83710eSEric Fiselier { 3735a83710eSEric Fiselier assert(!l0.locked()); 3745a83710eSEric Fiselier assert(!l1.locked()); 3755a83710eSEric Fiselier assert(!l2.locked()); 3765a83710eSEric Fiselier } 3775a83710eSEric Fiselier } 3785a83710eSEric Fiselier { 3795a83710eSEric Fiselier L1 l0; 3805a83710eSEric Fiselier L2 l1; 3815a83710eSEric Fiselier L2 l2; 3825a83710eSEric Fiselier try 3835a83710eSEric Fiselier { 3845a83710eSEric Fiselier std::lock(l0, l1, l2); 3855a83710eSEric Fiselier assert(false); 3865a83710eSEric Fiselier } 3875a83710eSEric Fiselier catch (int) 3885a83710eSEric Fiselier { 3895a83710eSEric Fiselier assert(!l0.locked()); 3905a83710eSEric Fiselier assert(!l1.locked()); 3915a83710eSEric Fiselier assert(!l2.locked()); 3925a83710eSEric Fiselier } 3935a83710eSEric Fiselier } 39460d6ef63SRoger Ferrer Ibanez #endif // TEST_HAS_NO_EXCEPTIONS 3955a83710eSEric Fiselier { 3965a83710eSEric Fiselier L0 l0; 3975a83710eSEric Fiselier L0 l1; 3985a83710eSEric Fiselier L0 l2; 3995a83710eSEric Fiselier L0 l3; 4005a83710eSEric Fiselier std::lock(l0, l1, l2, l3); 4015a83710eSEric Fiselier assert(l0.locked()); 4025a83710eSEric Fiselier assert(l1.locked()); 4035a83710eSEric Fiselier assert(l2.locked()); 4045a83710eSEric Fiselier assert(l3.locked()); 4055a83710eSEric Fiselier } 4065a83710eSEric Fiselier { 4075a83710eSEric Fiselier L0 l0; 4085a83710eSEric Fiselier L0 l1; 4095a83710eSEric Fiselier L0 l2; 4105a83710eSEric Fiselier L1 l3; 4115a83710eSEric Fiselier std::lock(l0, l1, l2, l3); 4125a83710eSEric Fiselier assert(l0.locked()); 4135a83710eSEric Fiselier assert(l1.locked()); 4145a83710eSEric Fiselier assert(l2.locked()); 4155a83710eSEric Fiselier assert(l3.locked()); 4165a83710eSEric Fiselier } 4175a83710eSEric Fiselier { 4185a83710eSEric Fiselier L0 l0; 4195a83710eSEric Fiselier L0 l1; 4205a83710eSEric Fiselier L1 l2; 4215a83710eSEric Fiselier L0 l3; 4225a83710eSEric Fiselier std::lock(l0, l1, l2, l3); 4235a83710eSEric Fiselier assert(l0.locked()); 4245a83710eSEric Fiselier assert(l1.locked()); 4255a83710eSEric Fiselier assert(l2.locked()); 4265a83710eSEric Fiselier assert(l3.locked()); 4275a83710eSEric Fiselier } 4285a83710eSEric Fiselier { 4295a83710eSEric Fiselier L0 l0; 4305a83710eSEric Fiselier L1 l1; 4315a83710eSEric Fiselier L0 l2; 4325a83710eSEric Fiselier L0 l3; 4335a83710eSEric Fiselier std::lock(l0, l1, l2, l3); 4345a83710eSEric Fiselier assert(l0.locked()); 4355a83710eSEric Fiselier assert(l1.locked()); 4365a83710eSEric Fiselier assert(l2.locked()); 4375a83710eSEric Fiselier assert(l3.locked()); 4385a83710eSEric Fiselier } 4395a83710eSEric Fiselier { 4405a83710eSEric Fiselier L1 l0; 4415a83710eSEric Fiselier L0 l1; 4425a83710eSEric Fiselier L0 l2; 4435a83710eSEric Fiselier L0 l3; 4445a83710eSEric Fiselier std::lock(l0, l1, l2, l3); 4455a83710eSEric Fiselier assert(l0.locked()); 4465a83710eSEric Fiselier assert(l1.locked()); 4475a83710eSEric Fiselier assert(l2.locked()); 4485a83710eSEric Fiselier assert(l3.locked()); 4495a83710eSEric Fiselier } 45060d6ef63SRoger Ferrer Ibanez #ifndef TEST_HAS_NO_EXCEPTIONS 4515a83710eSEric Fiselier { 4525a83710eSEric Fiselier L0 l0; 4535a83710eSEric Fiselier L0 l1; 4545a83710eSEric Fiselier L0 l2; 4555a83710eSEric Fiselier L2 l3; 4565a83710eSEric Fiselier try 4575a83710eSEric Fiselier { 4585a83710eSEric Fiselier std::lock(l0, l1, l2, l3); 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 assert(!l3.locked()); 4675a83710eSEric Fiselier } 4685a83710eSEric Fiselier } 4695a83710eSEric Fiselier { 4705a83710eSEric Fiselier L0 l0; 4715a83710eSEric Fiselier L0 l1; 4725a83710eSEric Fiselier L2 l2; 4735a83710eSEric Fiselier L0 l3; 4745a83710eSEric Fiselier try 4755a83710eSEric Fiselier { 4765a83710eSEric Fiselier std::lock(l0, l1, l2, l3); 4775a83710eSEric Fiselier assert(false); 4785a83710eSEric Fiselier } 4795a83710eSEric Fiselier catch (int) 4805a83710eSEric Fiselier { 4815a83710eSEric Fiselier assert(!l0.locked()); 4825a83710eSEric Fiselier assert(!l1.locked()); 4835a83710eSEric Fiselier assert(!l2.locked()); 4845a83710eSEric Fiselier assert(!l3.locked()); 4855a83710eSEric Fiselier } 4865a83710eSEric Fiselier } 4875a83710eSEric Fiselier { 4885a83710eSEric Fiselier L0 l0; 4895a83710eSEric Fiselier L2 l1; 4905a83710eSEric Fiselier L0 l2; 4915a83710eSEric Fiselier L0 l3; 4925a83710eSEric Fiselier try 4935a83710eSEric Fiselier { 4945a83710eSEric Fiselier std::lock(l0, l1, l2, l3); 4955a83710eSEric Fiselier assert(false); 4965a83710eSEric Fiselier } 4975a83710eSEric Fiselier catch (int) 4985a83710eSEric Fiselier { 4995a83710eSEric Fiselier assert(!l0.locked()); 5005a83710eSEric Fiselier assert(!l1.locked()); 5015a83710eSEric Fiselier assert(!l2.locked()); 5025a83710eSEric Fiselier assert(!l3.locked()); 5035a83710eSEric Fiselier } 5045a83710eSEric Fiselier } 5055a83710eSEric Fiselier { 5065a83710eSEric Fiselier L2 l0; 5075a83710eSEric Fiselier L0 l1; 5085a83710eSEric Fiselier L0 l2; 5095a83710eSEric Fiselier L0 l3; 5105a83710eSEric Fiselier try 5115a83710eSEric Fiselier { 5125a83710eSEric Fiselier std::lock(l0, l1, l2, l3); 5135a83710eSEric Fiselier assert(false); 5145a83710eSEric Fiselier } 5155a83710eSEric Fiselier catch (int) 5165a83710eSEric Fiselier { 5175a83710eSEric Fiselier assert(!l0.locked()); 5185a83710eSEric Fiselier assert(!l1.locked()); 5195a83710eSEric Fiselier assert(!l2.locked()); 5205a83710eSEric Fiselier assert(!l3.locked()); 5215a83710eSEric Fiselier } 5225a83710eSEric Fiselier } 52360d6ef63SRoger Ferrer Ibanez #endif // TEST_HAS_NO_EXCEPTIONS 524e11fb13bSEric Fiselier #endif // TEST_STD_VER >= 11 5252df59c50SJF Bastien 5262df59c50SJF Bastien return 0; 5275a83710eSEric Fiselier } 528