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()40 int 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()55 member_type::~member_type ()
56 {
57 	member_destructor_calls++;
58 }
59 
~base()60 base::~base ()
61 {
62 }
63 
~middle()64 middle::~middle ()
65 {
66 	middle_destructor_calls++;
67 }
68