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