1 // RUN: %clang_cc1 -fsyntax-only -Wnon-virtual-dtor -verify %s
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}}
29 // expected-error{{destructor cannot have a return type}}
37 ~E_typedef(); // expected-error{{destructor cannot be declared using a typedef 'E_typedef' (aka 'E') of the class name}}
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}}
56 // <rdar://problem/6841210>
64 ~X(); // expected-error {{expected the class name after '~' to name the enclosing class}}
68 class T
; // expected-note{{forward declaration}}
70 class QGenericArgument
// expected-note{{declared here}}
73 void foo(T t
) // expected-error{{variable has incomplete type}}
79 bob
<QGenericArgument
>(t
); // expected-error{{undeclared identifier 'bob'}} \
80 // expected-error{{does not refer to a value}}
86 template<class T
> class X
{ T v
; ~X() { ++*v
; } };
90 struct X0
{ virtual ~X0() throw(); };
91 struct X1
: public X0
{ };
93 // Make sure we instantiate operator deletes when building a virtual
96 template <class T
> class A
{
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 '::'}}
106 class B
: A
<int> { B(); }; // expected-note {{in instantiation of member function 'test6::A<int>::operator delete' requested here}}
110 // Make sure classes are marked invalid when they have invalid
111 // members. This avoids a crash-on-invalid.
114 ~A() const; // expected-error {{'const' qualifier is not allowed on a destructor}}
124 namespace nonvirtualdtor
{
125 struct S1
{ // expected-warning {{has virtual functions but non-virtual destructor}}
130 ~S2(); // expected-warning {{has virtual functions but non-virtual destructor}}
134 struct S3
: public S1
{ // expected-warning {{has virtual functions but non-virtual destructor}}
138 struct S4
: public S2
{ // expected-warning {{has virtual functions but non-virtual destructor}}
147 struct S5
: public B
{
163 template<class T
> class TS
: public B
{
169 template<class T
> class TS2
{ // expected-warning {{'nonvirtualdtor::TS2<int>' has virtual functions but non-virtual destructor}}
173 TS2
<int> foo
; // expected-note {{instantiation}}