1 // { dg-do run } 2 // { dg-options "-fipa-pta -fnon-call-exceptions" } 3 4 struct Mutex 5 { 6 bool locked; ~MutexMutex7 ~Mutex () 8 { 9 if (locked) 10 throw 0; 11 } lockMutex12 void lock () 13 { 14 locked = true; 15 } unlockMutex16 void unlock () 17 { 18 if (!locked) 19 throw 0; 20 locked = false; 21 } 22 }; 23 24 struct lock_guard 25 { 26 Mutex *m; lock_guardlock_guard27 lock_guard (Mutex *m) : m(m) 28 { 29 } ~lock_guardlock_guard30 ~lock_guard () 31 { 32 m->unlock (); 33 } 34 }; 35 36 int main()37main () 38 { 39 Mutex m; 40 m.lock (); 41 try 42 { 43 lock_guard l (&m); 44 } 45 catch ( ...) 46 { 47 __builtin_abort (); 48 } 49 return 0; 50 } 51