1// { dg-do run  }
2// Test that a throw in foo destroys the A, but does not free the memory.
3// Avoid use of none-overridable new/delete operators in shared
4// { dg-options "-static" { target *-*-mingw* } }
5
6#include <cstddef>
7#include <cstdlib>
8#include <new>
9
10struct A {
11  A();
12  ~A();
13};
14
15struct B {
16  B (A);
17};
18
19void foo (B*);
20
21int newed, created;
22
23int main ()
24{
25  try {
26    foo (new B (A ()));
27  } catch (...) { }
28
29  return !(newed && !created);
30}
31
32A::A() { created = 1; }
33A::~A() { created = 0; }
34B::B(A) { }
35void foo (B*) { throw 1; }
36
37void* operator new (size_t size)
38#if __cplusplus <= 199711L
39  throw (std::bad_alloc)
40#endif
41{
42  ++newed;
43  return (void *) std::malloc (size);
44}
45
46void operator delete (void *p) throw ()
47{
48  --newed;
49  std::free (p);
50}
51
52
53
54
55