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()37 main ()
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