Only warn for -Wnon-virtual-dtor for public destructors. Thanks to Benjamin Kramer...
[clang.git] / test / SemaCXX / destructor.cpp
blobce01b3acc5a5d1b63eb834cd9ba23c6a0c9b59f9
1 // RUN: %clang_cc1 -fsyntax-only -Wnon-virtual-dtor -verify %s
2 class A {
3 public:
4 ~A();
5 };
7 class B {
8 public:
9 ~B() { }
12 class C {
13 public:
14 (~C)() { }
17 struct D {
18 static void ~D(int, ...) const { } // \
19 // expected-error{{type qualifier is not allowed on this function}} \
20 // expected-error{{destructor cannot be declared 'static'}} \
21 // expected-error{{destructor cannot have any parameters}} \
22 // expected-error{{destructor cannot be variadic}} \
23 // expected-error{{destructor cannot have a return type}} \
24 // expected-error{{'const' qualifier is not allowed on a destructor}}
27 struct D2 {
28 void ~D2() { } // \
29 // expected-error{{destructor cannot have a return type}}
33 struct E;
35 typedef E E_typedef;
36 struct E {
37 ~E_typedef(); // expected-error{{destructor cannot be declared using a typedef 'E_typedef' (aka 'E') of the class name}}
40 struct F {
41 (~F)(); // expected-note {{previous declaration is here}}
42 ~F(); // expected-error {{destructor cannot be redeclared}}
45 ~; // expected-error {{expected a class name after '~' to name a destructor}}
46 ~undef(); // expected-error {{expected the class name after '~' to name a destructor}}
47 ~operator+(int, int); // expected-error {{expected a class name after '~' to name a destructor}}
48 ~F(){} // expected-error {{destructor must be a non-static member function}}
50 struct G {
51 ~G();
54 G::~G() { }
56 // <rdar://problem/6841210>
57 struct H {
58 ~H(void) { }
61 struct X {};
63 struct Y {
64 ~X(); // expected-error {{expected the class name after '~' to name the enclosing class}}
67 namespace PR6421 {
68 class T; // expected-note{{forward declaration}}
70 class QGenericArgument // expected-note{{declared here}}
72 template<typename U>
73 void foo(T t) // expected-error{{variable has incomplete type}}
74 { }
76 void disconnect()
78 T* t;
79 bob<QGenericArgument>(t); // expected-error{{undeclared identifier 'bob'}} \
80 // expected-error{{does not refer to a value}}
85 namespace PR6709 {
86 template<class T> class X { T v; ~X() { ++*v; } };
87 void a(X<int> x) {}
90 struct X0 { virtual ~X0() throw(); };
91 struct X1 : public X0 { };
93 // Make sure we instantiate operator deletes when building a virtual
94 // destructor.
95 namespace test6 {
96 template <class T> class A {
97 public:
98 void *operator new(__SIZE_TYPE__);
99 void operator delete(void *p) {
100 T::deleteIt(p); // expected-error {{type 'int' cannot be used prior to '::'}}
103 virtual ~A() {}
106 class B : A<int> { B(); }; // expected-note {{in instantiation of member function 'test6::A<int>::operator delete' requested here}}
107 B::B() {}
110 // Make sure classes are marked invalid when they have invalid
111 // members. This avoids a crash-on-invalid.
112 namespace test7 {
113 struct A {
114 ~A() const; // expected-error {{'const' qualifier is not allowed on a destructor}}
116 struct B : A {};
118 void test() {
119 B *b;
120 b->~B();
124 namespace nonvirtualdtor {
125 struct S1 { // expected-warning {{has virtual functions but non-virtual destructor}}
126 virtual void m();
129 struct S2 {
130 ~S2(); // expected-warning {{has virtual functions but non-virtual destructor}}
131 virtual void m();
134 struct S3 : public S1 { // expected-warning {{has virtual functions but non-virtual destructor}}
135 virtual void m();
138 struct S4 : public S2 { // expected-warning {{has virtual functions but non-virtual destructor}}
139 virtual void m();
142 struct B {
143 virtual ~B();
144 virtual void m();
147 struct S5 : public B {
148 virtual void m();
151 struct S6 {
152 virtual void m();
153 private:
154 ~S6();
157 struct S7 {
158 virtual void m();
159 protected:
160 ~S7();