| // { dg-do run } |
| // GROUPS passed destructors |
| // Check that member and base classes get properly destructed |
| // when an object of a derived class is destructed via a pointer |
| // to it which only has a "compile-time" type of "pointer-to-base". |
| // |
| // Note that in order for this test to work properly, the destructor |
| // for the base class should be explicitly declared to be virtual. |
| |
| extern "C" int printf (const char *, ...); |
| |
| int member_destructor_calls = 0; |
| int middle_destructor_calls = 0; |
| |
| struct member_type { |
| int data_member; |
| member_type () {} |
| ~member_type (); |
| }; |
| |
| struct base { |
| int data_member; |
| base () {} |
| virtual ~base (); |
| }; |
| |
| struct middle : public base { |
| member_type member1; |
| member_type member2; |
| middle () {} |
| ~middle (); // should be implicitly virtual |
| }; |
| |
| struct derived : public middle { |
| member_type member1; |
| member_type member2; |
| //~derived () {} |
| }; |
| |
| int main () |
| { |
| base* bp = new derived; |
| delete bp; |
| derived *dp = new derived; |
| delete dp; |
| |
| if ((member_destructor_calls != 8) || (middle_destructor_calls != 2)) |
| { printf ("FAIL\n"); return 1; } |
| else |
| printf ("PASS\n"); |
| |
| return 0; |
| } |
| |
| member_type::~member_type () |
| { |
| member_destructor_calls++; |
| } |
| |
| base::~base () |
| { |
| } |
| |
| middle::~middle () |
| { |
| middle_destructor_calls++; |
| } |