1 // { dg-options "-Wdelete-non-virtual-dtor" }
2 // { dg-do compile { target c++11 } }
4 struct polyBase { virtual void f(); };
6 void f(polyBase* p, polyBase* arr)
9 delete p; // { dg-warning "3:deleting \[^\n\r]* non-virtual destructor might" }
13 struct polyDerived : polyBase { };
15 void f(polyDerived* p, polyDerived* arr)
18 delete p; // { dg-warning "3:deleting \[^\n\r]* non-virtual destructor might" }
22 struct absDerived : polyBase { virtual void g() = 0; };
24 void f(absDerived* p, absDerived* arr)
26 delete p; // { dg-warning "3:deleting \[^\n\r]* non-virtual destructor will" }
30 struct finalDerived final : polyBase { };
32 void f(finalDerived* p, finalDerived* arr)
35 delete p; // no error for final classes
39 struct safeBase { virtual ~safeBase(); };
40 struct safeDerived : safeBase { virtual void f(); };
42 void f(safeDerived* p, safeDerived* arr)
45 delete p; // no error because base has virtual dtor
49 struct polyBaseNonTrivial { ~polyBaseNonTrivial(); virtual void f(); };
51 void f(polyBaseNonTrivial* p, polyBaseNonTrivial* arr)
53 polyBaseNonTrivial pbnt;
54 delete p; // { dg-warning "3:deleting \[^\n\r]* non-virtual destructor might" }
58 struct polyDerivedNT : polyBaseNonTrivial { ~polyDerivedNT(); };
60 void f(polyDerivedNT* p, polyDerivedNT* arr)
63 delete p; // { dg-warning "3:deleting \[^\n\r]* non-virtual destructor might" }