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