| // { dg-do run } |
| // Origin: philip_martin@ntlworld.com |
| |
| #include <new> |
| |
| extern "C" void abort(); |
| |
| bool new_flag = false; |
| bool delete_flag = false; |
| |
| struct X { |
| X() |
| { |
| throw 1; |
| } |
| void* operator new ( std::size_t n ) throw ( std::bad_alloc ) |
| { |
| new_flag = true; |
| return ::operator new( n ); |
| } |
| void operator delete( void* p, std::size_t n ) throw() |
| { |
| delete_flag = true; |
| ::operator delete( p ); |
| } |
| }; |
| |
| int |
| main() |
| { |
| try |
| { |
| X* x = new X; // gcc 3.0 fails to call operator delete when X::X throws |
| } |
| catch ( ... ) |
| { |
| } |
| if ( ! new_flag || ! delete_flag ) |
| ::abort(); |
| } |