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 10 extern "C" int printf (const char *, ...); 11 12 int member_destructor_calls = 0; 13 int middle_destructor_calls = 0; 14 15 struct member_type { 16 int data_member; member_typemember_type17 member_type () {} 18 ~member_type (); 19 }; 20 21 struct base { 22 int data_member; basebase23 base () {} 24 virtual ~base (); 25 }; 26 27 struct middle : public base { 28 member_type member1; 29 member_type member2; middlemiddle30 middle () {} 31 ~middle (); // should be implicitly virtual 32 }; 33 34 struct derived : public middle { 35 member_type member1; 36 member_type member2; 37 //~derived () {} 38 }; 39 main()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 ~member_type()55member_type::~member_type () 56 { 57 member_destructor_calls++; 58 } 59 ~base()60base::~base () 61 { 62 } 63 ~middle()64middle::~middle () 65 { 66 middle_destructor_calls++; 67 } 68