1 // { dg-do run  }
2 // Origin: philip_martin@ntlworld.com
3 
4 #include <new>
5 
6 extern "C" void abort();
7 
8 bool new_flag = false;
9 bool delete_flag = false;
10 
11 struct X {
XX12   X()
13   {
14     throw 1;
15   }
newX16   void* operator new ( std::size_t n ) throw ( std::bad_alloc )
17   {
18     new_flag = true;
19     return ::operator new( n );
20   }
deleteX21   void operator delete( void* p, std::size_t n ) throw()
22   {
23     delete_flag = true;
24     ::operator delete( p );
25   }
26 };
27 
28 int
main()29 main()
30 {
31   try
32     {
33       X* x = new X; // gcc 3.0 fails to call operator delete when X::X throws
34     }
35   catch ( ... )
36     {
37     }
38   if ( ! new_flag || ! delete_flag )
39     ::abort();
40 }
41