2018-02-09 Sebastian Perta <sebastian.perta@renesas.com>
[official-gcc.git] / gcc / testsuite / g++.old-deja / g++.brendan / dtors3.C
blob053bb0dae7abd5bf21ec126091b4ea2fbcc13e34
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.
10 extern "C" int printf (const char *, ...); 
12 int member_destructor_calls = 0;
13 int middle_destructor_calls = 0;
15 struct member_type {
16         int data_member;
17         member_type () {}
18         ~member_type ();
21 struct base {
22         int data_member;
23         base () {}
24         virtual ~base ();
27 struct middle : public base {
28         member_type member1;
29         member_type member2;
30         middle () {}
31         ~middle ();             // should be implicitly virtual
34 struct derived : public middle {
35         member_type member1;
36         member_type member2;
37         //~derived () {}
40 int main ()
42         base* bp = new derived;
43         delete bp;
44         derived *dp = new derived;
45         delete dp;
47         if ((member_destructor_calls != 8) || (middle_destructor_calls != 2))
48           { printf ("FAIL\n"); return 1; }
49         else
50           printf ("PASS\n");
52         return 0;
55 member_type::~member_type ()
57         member_destructor_calls++;
60 base::~base ()
64 middle::~middle ()
66         middle_destructor_calls++;