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