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