destructor.cpp revision def4e2a405a15eb8381ca305725285d27a4bab65
1def4e2a405a15eb8381ca305725285d27a4bab65Argyrios Kyrtzidis// RUN: %clang_cc1 -fsyntax-only -Wnon-virtual-dtor -verify %s 242a552f8200ba5948661aee0106fce0c04e39818Douglas Gregorclass A { 342a552f8200ba5948661aee0106fce0c04e39818Douglas Gregorpublic: 442a552f8200ba5948661aee0106fce0c04e39818Douglas Gregor ~A(); 542a552f8200ba5948661aee0106fce0c04e39818Douglas Gregor}; 642a552f8200ba5948661aee0106fce0c04e39818Douglas Gregor 742a552f8200ba5948661aee0106fce0c04e39818Douglas Gregorclass B { 842a552f8200ba5948661aee0106fce0c04e39818Douglas Gregorpublic: 942a552f8200ba5948661aee0106fce0c04e39818Douglas Gregor ~B() { } 1042a552f8200ba5948661aee0106fce0c04e39818Douglas Gregor}; 1142a552f8200ba5948661aee0106fce0c04e39818Douglas Gregor 1242a552f8200ba5948661aee0106fce0c04e39818Douglas Gregorclass C { 1342a552f8200ba5948661aee0106fce0c04e39818Douglas Gregorpublic: 1442a552f8200ba5948661aee0106fce0c04e39818Douglas Gregor (~C)() { } 1542a552f8200ba5948661aee0106fce0c04e39818Douglas Gregor}; 1642a552f8200ba5948661aee0106fce0c04e39818Douglas Gregor 1742a552f8200ba5948661aee0106fce0c04e39818Douglas Gregorstruct D { 1842a552f8200ba5948661aee0106fce0c04e39818Douglas Gregor static void ~D(int, ...) const { } // \ 1942a552f8200ba5948661aee0106fce0c04e39818Douglas Gregor // expected-error{{type qualifier is not allowed on this function}} \ 2042a552f8200ba5948661aee0106fce0c04e39818Douglas Gregor // expected-error{{destructor cannot be declared 'static'}} \ 2142a552f8200ba5948661aee0106fce0c04e39818Douglas Gregor // expected-error{{destructor cannot have any parameters}} \ 22d92ec474faeb6133e0d41f0de4526b22778476f2Douglas Gregor // expected-error{{destructor cannot be variadic}} \ 23d92ec474faeb6133e0d41f0de4526b22778476f2Douglas Gregor // expected-error{{destructor cannot have a return type}} \ 24d92ec474faeb6133e0d41f0de4526b22778476f2Douglas Gregor // expected-error{{'const' qualifier is not allowed on a destructor}} 2542a552f8200ba5948661aee0106fce0c04e39818Douglas Gregor}; 2642a552f8200ba5948661aee0106fce0c04e39818Douglas Gregor 276540180c2fd7a5b4963b22dc81461b73927499a8Chris Lattnerstruct D2 { 286540180c2fd7a5b4963b22dc81461b73927499a8Chris Lattner void ~D2() { } // \ 296540180c2fd7a5b4963b22dc81461b73927499a8Chris Lattner // expected-error{{destructor cannot have a return type}} 306540180c2fd7a5b4963b22dc81461b73927499a8Chris Lattner}; 316540180c2fd7a5b4963b22dc81461b73927499a8Chris Lattner 32eaaebc7cf10dc1a2016183a262ad3256bc468759Chris Lattner 3342a552f8200ba5948661aee0106fce0c04e39818Douglas Gregorstruct E; 3442a552f8200ba5948661aee0106fce0c04e39818Douglas Gregor 3542a552f8200ba5948661aee0106fce0c04e39818Douglas Gregortypedef E E_typedef; 3642a552f8200ba5948661aee0106fce0c04e39818Douglas Gregorstruct E { 377c2342dd4c9947806842e5aca3d2bb2e542853c9John McCall ~E_typedef(); // expected-error{{destructor cannot be declared using a typedef 'E_typedef' (aka 'E') of the class name}} 3842a552f8200ba5948661aee0106fce0c04e39818Douglas Gregor}; 3942a552f8200ba5948661aee0106fce0c04e39818Douglas Gregor 4042a552f8200ba5948661aee0106fce0c04e39818Douglas Gregorstruct F { 415f4a6829dc58cab2f76e2b98492859aa3b91e3f2Chris Lattner (~F)(); // expected-note {{previous declaration is here}} 425f4a6829dc58cab2f76e2b98492859aa3b91e3f2Chris Lattner ~F(); // expected-error {{destructor cannot be redeclared}} 4342a552f8200ba5948661aee0106fce0c04e39818Douglas Gregor}; 4442a552f8200ba5948661aee0106fce0c04e39818Douglas Gregor 45124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor~; // expected-error {{expected a class name after '~' to name a destructor}} 4676ed9cb1d7398bb721cb9df67b3004c14dae8aa8Fariborz Jahanian~undef(); // expected-error {{expected the class name after '~' to name a destructor}} 47124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor~operator+(int, int); // expected-error {{expected a class name after '~' to name a destructor}} 48c7ed9c60b8ee04b119e23441cae2cfec74536ba9Argyrios Kyrtzidis~F(){} // expected-error {{destructor must be a non-static member function}} 499d35097bc0fefb2f77638be513cac72d1c09d840Douglas Gregor 509d35097bc0fefb2f77638be513cac72d1c09d840Douglas Gregorstruct G { 519d35097bc0fefb2f77638be513cac72d1c09d840Douglas Gregor ~G(); 529d35097bc0fefb2f77638be513cac72d1c09d840Douglas Gregor}; 539d35097bc0fefb2f77638be513cac72d1c09d840Douglas Gregor 549d35097bc0fefb2f77638be513cac72d1c09d840Douglas GregorG::~G() { } 559d35097bc0fefb2f77638be513cac72d1c09d840Douglas Gregor 567786d1c5d752b90ff74093bd1ffda37daf0dbe6eAnders Carlsson// <rdar://problem/6841210> 577786d1c5d752b90ff74093bd1ffda37daf0dbe6eAnders Carlssonstruct H { 587786d1c5d752b90ff74093bd1ffda37daf0dbe6eAnders Carlsson ~H(void) { } 597786d1c5d752b90ff74093bd1ffda37daf0dbe6eAnders Carlsson}; 60c19f959d7fa5303f2fff5fa7a4968361cb7ef068Fariborz Jahanian 61c19f959d7fa5303f2fff5fa7a4968361cb7ef068Fariborz Jahanianstruct X {}; 62c19f959d7fa5303f2fff5fa7a4968361cb7ef068Fariborz Jahanian 63c19f959d7fa5303f2fff5fa7a4968361cb7ef068Fariborz Jahanianstruct Y { 64c19f959d7fa5303f2fff5fa7a4968361cb7ef068Fariborz Jahanian ~X(); // expected-error {{expected the class name after '~' to name the enclosing class}} 65c19f959d7fa5303f2fff5fa7a4968361cb7ef068Fariborz Jahanian}; 66333de066a0c018170142150d563f3acdb2ad80f2Douglas Gregor 67333de066a0c018170142150d563f3acdb2ad80f2Douglas Gregornamespace PR6421 { 68333de066a0c018170142150d563f3acdb2ad80f2Douglas Gregor class T; // expected-note{{forward declaration}} 69333de066a0c018170142150d563f3acdb2ad80f2Douglas Gregor 70200b2921390bd75a659be3c77011e9a5548b7273Douglas Gregor class QGenericArgument // expected-note{{declared here}} 71333de066a0c018170142150d563f3acdb2ad80f2Douglas Gregor { 72333de066a0c018170142150d563f3acdb2ad80f2Douglas Gregor template<typename U> 73333de066a0c018170142150d563f3acdb2ad80f2Douglas Gregor void foo(T t) // expected-error{{variable has incomplete type}} 74333de066a0c018170142150d563f3acdb2ad80f2Douglas Gregor { } 75333de066a0c018170142150d563f3acdb2ad80f2Douglas Gregor 76333de066a0c018170142150d563f3acdb2ad80f2Douglas Gregor void disconnect() 77333de066a0c018170142150d563f3acdb2ad80f2Douglas Gregor { 78333de066a0c018170142150d563f3acdb2ad80f2Douglas Gregor T* t; 79200b2921390bd75a659be3c77011e9a5548b7273Douglas Gregor bob<QGenericArgument>(t); // expected-error{{undeclared identifier 'bob'}} \ 80200b2921390bd75a659be3c77011e9a5548b7273Douglas Gregor // expected-error{{does not refer to a value}} 81333de066a0c018170142150d563f3acdb2ad80f2Douglas Gregor } 82333de066a0c018170142150d563f3acdb2ad80f2Douglas Gregor }; 83333de066a0c018170142150d563f3acdb2ad80f2Douglas Gregor} 849c127392efe91dadacbe28ca16b8a9a5fa7990b3Douglas Gregor 859c127392efe91dadacbe28ca16b8a9a5fa7990b3Douglas Gregornamespace PR6709 { 869c127392efe91dadacbe28ca16b8a9a5fa7990b3Douglas Gregor template<class T> class X { T v; ~X() { ++*v; } }; 879c127392efe91dadacbe28ca16b8a9a5fa7990b3Douglas Gregor void a(X<int> x) {} 889c127392efe91dadacbe28ca16b8a9a5fa7990b3Douglas Gregor} 89d92ec474faeb6133e0d41f0de4526b22778476f2Douglas Gregor 90d92ec474faeb6133e0d41f0de4526b22778476f2Douglas Gregorstruct X0 { virtual ~X0() throw(); }; 91d92ec474faeb6133e0d41f0de4526b22778476f2Douglas Gregorstruct X1 : public X0 { }; 925efd91a3b58e59006f8a3e8c9256ec00c38dba95John McCall 935efd91a3b58e59006f8a3e8c9256ec00c38dba95John McCall// Make sure we instantiate operator deletes when building a virtual 945efd91a3b58e59006f8a3e8c9256ec00c38dba95John McCall// destructor. 955efd91a3b58e59006f8a3e8c9256ec00c38dba95John McCallnamespace test6 { 965efd91a3b58e59006f8a3e8c9256ec00c38dba95John McCall template <class T> class A { 975efd91a3b58e59006f8a3e8c9256ec00c38dba95John McCall public: 986b855121f3c23e9cf2b548cbf2dd3d16fdcf610cBenjamin Kramer void *operator new(__SIZE_TYPE__); 995efd91a3b58e59006f8a3e8c9256ec00c38dba95John McCall void operator delete(void *p) { 1005efd91a3b58e59006f8a3e8c9256ec00c38dba95John McCall T::deleteIt(p); // expected-error {{type 'int' cannot be used prior to '::'}} 1015efd91a3b58e59006f8a3e8c9256ec00c38dba95John McCall } 1025efd91a3b58e59006f8a3e8c9256ec00c38dba95John McCall 1032a5f99eb4e2af771faacfceb9f78e230129c5e5aNick Lewycky virtual ~A() {} 1045efd91a3b58e59006f8a3e8c9256ec00c38dba95John McCall }; 1055efd91a3b58e59006f8a3e8c9256ec00c38dba95John McCall 1062a5f99eb4e2af771faacfceb9f78e230129c5e5aNick Lewycky class B : A<int> { B(); }; // expected-note {{in instantiation of member function 'test6::A<int>::operator delete' requested here}} 1072a5f99eb4e2af771faacfceb9f78e230129c5e5aNick Lewycky B::B() {} 1085efd91a3b58e59006f8a3e8c9256ec00c38dba95John McCall} 109fcadea2556be268121a6216e367bbe3598c4008eJohn McCall 110fcadea2556be268121a6216e367bbe3598c4008eJohn McCall// Make sure classes are marked invalid when they have invalid 111fcadea2556be268121a6216e367bbe3598c4008eJohn McCall// members. This avoids a crash-on-invalid. 112fcadea2556be268121a6216e367bbe3598c4008eJohn McCallnamespace test7 { 113fcadea2556be268121a6216e367bbe3598c4008eJohn McCall struct A { 114fcadea2556be268121a6216e367bbe3598c4008eJohn McCall ~A() const; // expected-error {{'const' qualifier is not allowed on a destructor}} 115fcadea2556be268121a6216e367bbe3598c4008eJohn McCall }; 116fcadea2556be268121a6216e367bbe3598c4008eJohn McCall struct B : A {}; 117fcadea2556be268121a6216e367bbe3598c4008eJohn McCall 118fcadea2556be268121a6216e367bbe3598c4008eJohn McCall void test() { 119fcadea2556be268121a6216e367bbe3598c4008eJohn McCall B *b; 120fcadea2556be268121a6216e367bbe3598c4008eJohn McCall b->~B(); 121fcadea2556be268121a6216e367bbe3598c4008eJohn McCall } 122fcadea2556be268121a6216e367bbe3598c4008eJohn McCall} 123def4e2a405a15eb8381ca305725285d27a4bab65Argyrios Kyrtzidis 124def4e2a405a15eb8381ca305725285d27a4bab65Argyrios Kyrtzidisnamespace nonvirtualdtor { 125def4e2a405a15eb8381ca305725285d27a4bab65Argyrios Kyrtzidisstruct S1 { // expected-warning {{has virtual functions but non-virtual destructor}} 126def4e2a405a15eb8381ca305725285d27a4bab65Argyrios Kyrtzidis virtual void m(); 127def4e2a405a15eb8381ca305725285d27a4bab65Argyrios Kyrtzidis}; 128def4e2a405a15eb8381ca305725285d27a4bab65Argyrios Kyrtzidis 129def4e2a405a15eb8381ca305725285d27a4bab65Argyrios Kyrtzidisstruct S2 { 130def4e2a405a15eb8381ca305725285d27a4bab65Argyrios Kyrtzidis ~S2(); // expected-warning {{has virtual functions but non-virtual destructor}} 131def4e2a405a15eb8381ca305725285d27a4bab65Argyrios Kyrtzidis virtual void m(); 132def4e2a405a15eb8381ca305725285d27a4bab65Argyrios Kyrtzidis}; 133def4e2a405a15eb8381ca305725285d27a4bab65Argyrios Kyrtzidis 134def4e2a405a15eb8381ca305725285d27a4bab65Argyrios Kyrtzidisstruct S3 : public S1 { // expected-warning {{has virtual functions but non-virtual destructor}} 135def4e2a405a15eb8381ca305725285d27a4bab65Argyrios Kyrtzidis virtual void m(); 136def4e2a405a15eb8381ca305725285d27a4bab65Argyrios Kyrtzidis}; 137def4e2a405a15eb8381ca305725285d27a4bab65Argyrios Kyrtzidis 138def4e2a405a15eb8381ca305725285d27a4bab65Argyrios Kyrtzidisstruct S4 : public S2 { // expected-warning {{has virtual functions but non-virtual destructor}} 139def4e2a405a15eb8381ca305725285d27a4bab65Argyrios Kyrtzidis virtual void m(); 140def4e2a405a15eb8381ca305725285d27a4bab65Argyrios Kyrtzidis}; 141def4e2a405a15eb8381ca305725285d27a4bab65Argyrios Kyrtzidis 142def4e2a405a15eb8381ca305725285d27a4bab65Argyrios Kyrtzidisstruct B { 143def4e2a405a15eb8381ca305725285d27a4bab65Argyrios Kyrtzidis virtual ~B(); 144def4e2a405a15eb8381ca305725285d27a4bab65Argyrios Kyrtzidis virtual void m(); 145def4e2a405a15eb8381ca305725285d27a4bab65Argyrios Kyrtzidis}; 146def4e2a405a15eb8381ca305725285d27a4bab65Argyrios Kyrtzidis 147def4e2a405a15eb8381ca305725285d27a4bab65Argyrios Kyrtzidisstruct S5 : public B { 148def4e2a405a15eb8381ca305725285d27a4bab65Argyrios Kyrtzidis virtual void m(); 149def4e2a405a15eb8381ca305725285d27a4bab65Argyrios Kyrtzidis}; 150def4e2a405a15eb8381ca305725285d27a4bab65Argyrios Kyrtzidis} 151