111
|
1 // { dg-options "-Wdelete-non-virtual-dtor" }
|
|
2 // { dg-do compile { target c++11 } }
|
|
3
|
|
4 struct polyBase { virtual void f(); };
|
|
5
|
|
6 void f(polyBase* p, polyBase* arr)
|
|
7 {
|
|
8 polyBase pb;
|
145
|
9 delete p; // { dg-warning "3:deleting \[^\n\r]* non-virtual destructor might" }
|
111
|
10 delete [] arr;
|
|
11 }
|
|
12
|
|
13 struct polyDerived : polyBase { };
|
|
14
|
|
15 void f(polyDerived* p, polyDerived* arr)
|
|
16 {
|
|
17 polyDerived pd;
|
145
|
18 delete p; // { dg-warning "3:deleting \[^\n\r]* non-virtual destructor might" }
|
111
|
19 delete [] arr;
|
|
20 }
|
|
21
|
|
22 struct absDerived : polyBase { virtual void g() = 0; };
|
|
23
|
|
24 void f(absDerived* p, absDerived* arr)
|
|
25 {
|
145
|
26 delete p; // { dg-warning "3:deleting \[^\n\r]* non-virtual destructor will" }
|
111
|
27 delete [] arr;
|
|
28 }
|
|
29
|
|
30 struct finalDerived final : polyBase { };
|
|
31
|
|
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
|
|
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
|
|
51 void f(polyBaseNonTrivial* p, polyBaseNonTrivial* arr)
|
|
52 {
|
|
53 polyBaseNonTrivial pbnt;
|
145
|
54 delete p; // { dg-warning "3:deleting \[^\n\r]* non-virtual destructor might" }
|
111
|
55 delete [] arr;
|
|
56 }
|
|
57
|
|
58 struct polyDerivedNT : polyBaseNonTrivial { ~polyDerivedNT(); };
|
|
59
|
|
60 void f(polyDerivedNT* p, polyDerivedNT* arr)
|
|
61 {
|
|
62 polyDerivedNT pdnt;
|
145
|
63 delete p; // { dg-warning "3:deleting \[^\n\r]* non-virtual destructor might" }
|
111
|
64 delete [] arr;
|
|
65 }
|
|
66
|