1// { dg-do run  }
2// Origin: philip_martin@ntlworld.com
3
4#include <new>
5
6extern "C" void abort();
7
8bool new_flag = false;
9bool delete_flag = false;
10
11struct X {
12  X()
13  {
14    throw 1;
15  }
16  void* operator new ( std::size_t n ) throw ( std::bad_alloc )
17  {
18    new_flag = true;
19    return ::operator new( n );
20  }
21  void operator delete( void* p, std::size_t n ) throw()
22  {
23    delete_flag = true;
24    ::operator delete( p );
25  }
26};
27
28int
29main()
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