1 // PR c++/5757
2 // Test that when a constructor throws in a new-expression, we pass the
3 // right pointer to operator delete.
4 
5 // { dg-do run }
6 
7 #include <new>
8 #include <stddef.h>
9 
10 int ret = 1;
11 
12 void *ptr;
operator new[](size_t s)13 void * operator new[] (size_t s) throw (std::bad_alloc)
14 {
15   ptr = operator new (s);
16   return ptr;
17 }
18 
operator delete[](void * p)19 void operator delete[] (void *p) throw ()
20 {
21   if (p == ptr)
22     ret = 0;
23   operator delete (p);
24 }
25 
26 struct A
27 {
AA28   A() { throw 1; }
~AA29   ~A() {}
30 };
31 
32 int
main()33 main ()
34 {
35   try
36     {
37       A *p = new A[4];
38     }
39   catch (...) {}
40   return ret;
41 }
42