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