1 // { dg-options "-Wdelete-non-virtual-dtor" }
2 // { dg-do compile { target c++11 } }
3
4 struct polyBase { virtual void f(); };
5
f(polyBase * p,polyBase * arr)6 void f(polyBase* p, polyBase* arr)
7 {
8 polyBase pb;
9 delete p; // { dg-warning "non-virtual destructor might" }
10 delete [] arr;
11 }
12
13 struct polyDerived : polyBase { };
14
f(polyDerived * p,polyDerived * arr)15 void f(polyDerived* p, polyDerived* arr)
16 {
17 polyDerived pd;
18 delete p; // { dg-warning "non-virtual destructor might" }
19 delete [] arr;
20 }
21
22 struct absDerived : polyBase { virtual void g() = 0; };
23
f(absDerived * p,absDerived * arr)24 void f(absDerived* p, absDerived* arr)
25 {
26 delete p; // { dg-warning "non-virtual destructor will" }
27 delete [] arr;
28 }
29
30 struct finalDerived final : polyBase { };
31
f(finalDerived * p,finalDerived * arr)32 void f(finalDerived* p, finalDerived* arr)
33 {
34 finalDerived fd;
35 delete p; // no error for final classes
36 delete [] arr;
37 }
38
39 struct safeBase { virtual ~safeBase(); };
40 struct safeDerived : safeBase { virtual void f(); };
41
f(safeDerived * p,safeDerived * arr)42 void f(safeDerived* p, safeDerived* arr)
43 {
44 safeDerived sd;
45 delete p; // no error because base has virtual dtor
46 delete [] arr;
47 }
48
49 struct polyBaseNonTrivial { ~polyBaseNonTrivial(); virtual void f(); };
50
f(polyBaseNonTrivial * p,polyBaseNonTrivial * arr)51 void f(polyBaseNonTrivial* p, polyBaseNonTrivial* arr)
52 {
53 polyBaseNonTrivial pbnt;
54 delete p; // { dg-warning "non-virtual destructor might" }
55 delete [] arr;
56 }
57
58 struct polyDerivedNT : polyBaseNonTrivial { ~polyDerivedNT(); };
59
f(polyDerivedNT * p,polyDerivedNT * arr)60 void f(polyDerivedNT* p, polyDerivedNT* arr)
61 {
62 polyDerivedNT pdnt;
63 delete p; // { dg-warning "non-virtual destructor might" }
64 delete [] arr;
65 }
66
67