1// { dg-do run } 2// GROUPS passed destructors 3// Check that member and base classes get properly destructed 4// when an object of a derived class is destructed via a pointer 5// to it which only has a "compile-time" type of "pointer-to-base". 6// 7// Note that in order for this test to work properly, the destructor 8// for the base class should be explicitly declared to be virtual. 9 10extern "C" int printf (const char *, ...); 11 12int member_destructor_calls = 0; 13int middle_destructor_calls = 0; 14 15struct member_type { 16 int data_member; 17 member_type () {} 18 ~member_type (); 19}; 20 21struct base { 22 int data_member; 23 base () {} 24 virtual ~base (); 25}; 26 27struct middle : public base { 28 member_type member1; 29 member_type member2; 30 middle () {} 31 ~middle (); // should be implicitly virtual 32}; 33 34struct derived : public middle { 35 member_type member1; 36 member_type member2; 37 //~derived () {} 38}; 39 40int main () 41{ 42 base* bp = new derived; 43 delete bp; 44 derived *dp = new derived; 45 delete dp; 46 47 if ((member_destructor_calls != 8) || (middle_destructor_calls != 2)) 48 { printf ("FAIL\n"); return 1; } 49 else 50 printf ("PASS\n"); 51 52 return 0; 53} 54 55member_type::~member_type () 56{ 57 member_destructor_calls++; 58} 59 60base::~base () 61{ 62} 63 64middle::~middle () 65{ 66 middle_destructor_calls++; 67} 68