1651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// RUN: %clang_cc1 -std=c++11 -triple %itanium_abi_triple -fsyntax-only -Wnon-virtual-dtor -Wdelete-non-virtual-dtor -verify %s 2651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// RUN: %clang_cc1 -std=c++11 -triple %ms_abi_triple -DMSABI -fsyntax-only -Wnon-virtual-dtor -Wdelete-non-virtual-dtor -verify %s 342a552f8200ba5948661aee0106fce0c04e39818Douglas Gregorclass A { 442a552f8200ba5948661aee0106fce0c04e39818Douglas Gregorpublic: 542a552f8200ba5948661aee0106fce0c04e39818Douglas Gregor ~A(); 642a552f8200ba5948661aee0106fce0c04e39818Douglas Gregor}; 742a552f8200ba5948661aee0106fce0c04e39818Douglas Gregor 842a552f8200ba5948661aee0106fce0c04e39818Douglas Gregorclass B { 942a552f8200ba5948661aee0106fce0c04e39818Douglas Gregorpublic: 1042a552f8200ba5948661aee0106fce0c04e39818Douglas Gregor ~B() { } 1142a552f8200ba5948661aee0106fce0c04e39818Douglas Gregor}; 1242a552f8200ba5948661aee0106fce0c04e39818Douglas Gregor 1342a552f8200ba5948661aee0106fce0c04e39818Douglas Gregorclass C { 1442a552f8200ba5948661aee0106fce0c04e39818Douglas Gregorpublic: 1542a552f8200ba5948661aee0106fce0c04e39818Douglas Gregor (~C)() { } 1642a552f8200ba5948661aee0106fce0c04e39818Douglas Gregor}; 1742a552f8200ba5948661aee0106fce0c04e39818Douglas Gregor 1842a552f8200ba5948661aee0106fce0c04e39818Douglas Gregorstruct D { 1942a552f8200ba5948661aee0106fce0c04e39818Douglas Gregor static void ~D(int, ...) const { } // \ 20d37b360bf9f954af119c9805fdc79ab9d30e06c6Richard Smith // expected-error{{static member function cannot have 'const' qualifier}} \ 2142a552f8200ba5948661aee0106fce0c04e39818Douglas Gregor // expected-error{{destructor cannot be declared 'static'}} \ 2242a552f8200ba5948661aee0106fce0c04e39818Douglas Gregor // expected-error{{destructor cannot have any parameters}} \ 23d92ec474faeb6133e0d41f0de4526b22778476f2Douglas Gregor // expected-error{{destructor cannot be variadic}} \ 24d92ec474faeb6133e0d41f0de4526b22778476f2Douglas Gregor // expected-error{{destructor cannot have a return type}} \ 25d92ec474faeb6133e0d41f0de4526b22778476f2Douglas Gregor // expected-error{{'const' qualifier is not allowed on a destructor}} 2642a552f8200ba5948661aee0106fce0c04e39818Douglas Gregor}; 2742a552f8200ba5948661aee0106fce0c04e39818Douglas Gregor 286540180c2fd7a5b4963b22dc81461b73927499a8Chris Lattnerstruct D2 { 296540180c2fd7a5b4963b22dc81461b73927499a8Chris Lattner void ~D2() { } // \ 306540180c2fd7a5b4963b22dc81461b73927499a8Chris Lattner // expected-error{{destructor cannot have a return type}} 316540180c2fd7a5b4963b22dc81461b73927499a8Chris Lattner}; 326540180c2fd7a5b4963b22dc81461b73927499a8Chris Lattner 33eaaebc7cf10dc1a2016183a262ad3256bc468759Chris Lattner 3442a552f8200ba5948661aee0106fce0c04e39818Douglas Gregorstruct E; 3542a552f8200ba5948661aee0106fce0c04e39818Douglas Gregor 3642a552f8200ba5948661aee0106fce0c04e39818Douglas Gregortypedef E E_typedef; 3742a552f8200ba5948661aee0106fce0c04e39818Douglas Gregorstruct E { 387c2342dd4c9947806842e5aca3d2bb2e542853c9John McCall ~E_typedef(); // expected-error{{destructor cannot be declared using a typedef 'E_typedef' (aka 'E') of the class name}} 3942a552f8200ba5948661aee0106fce0c04e39818Douglas Gregor}; 4042a552f8200ba5948661aee0106fce0c04e39818Douglas Gregor 4142a552f8200ba5948661aee0106fce0c04e39818Douglas Gregorstruct F { 425f4a6829dc58cab2f76e2b98492859aa3b91e3f2Chris Lattner (~F)(); // expected-note {{previous declaration is here}} 435f4a6829dc58cab2f76e2b98492859aa3b91e3f2Chris Lattner ~F(); // expected-error {{destructor cannot be redeclared}} 4442a552f8200ba5948661aee0106fce0c04e39818Douglas Gregor}; 4542a552f8200ba5948661aee0106fce0c04e39818Douglas Gregor 46124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor~; // expected-error {{expected a class name after '~' to name a destructor}} 4776ed9cb1d7398bb721cb9df67b3004c14dae8aa8Fariborz Jahanian~undef(); // expected-error {{expected the class name after '~' to name a destructor}} 48124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor~operator+(int, int); // expected-error {{expected a class name after '~' to name a destructor}} 49c7ed9c60b8ee04b119e23441cae2cfec74536ba9Argyrios Kyrtzidis~F(){} // expected-error {{destructor must be a non-static member function}} 509d35097bc0fefb2f77638be513cac72d1c09d840Douglas Gregor 519d35097bc0fefb2f77638be513cac72d1c09d840Douglas Gregorstruct G { 529d35097bc0fefb2f77638be513cac72d1c09d840Douglas Gregor ~G(); 539d35097bc0fefb2f77638be513cac72d1c09d840Douglas Gregor}; 549d35097bc0fefb2f77638be513cac72d1c09d840Douglas Gregor 559d35097bc0fefb2f77638be513cac72d1c09d840Douglas GregorG::~G() { } 569d35097bc0fefb2f77638be513cac72d1c09d840Douglas Gregor 577786d1c5d752b90ff74093bd1ffda37daf0dbe6eAnders Carlsson// <rdar://problem/6841210> 587786d1c5d752b90ff74093bd1ffda37daf0dbe6eAnders Carlssonstruct H { 597786d1c5d752b90ff74093bd1ffda37daf0dbe6eAnders Carlsson ~H(void) { } 607786d1c5d752b90ff74093bd1ffda37daf0dbe6eAnders Carlsson}; 61c19f959d7fa5303f2fff5fa7a4968361cb7ef068Fariborz Jahanian 62c19f959d7fa5303f2fff5fa7a4968361cb7ef068Fariborz Jahanianstruct X {}; 63c19f959d7fa5303f2fff5fa7a4968361cb7ef068Fariborz Jahanian 64c19f959d7fa5303f2fff5fa7a4968361cb7ef068Fariborz Jahanianstruct Y { 65c19f959d7fa5303f2fff5fa7a4968361cb7ef068Fariborz Jahanian ~X(); // expected-error {{expected the class name after '~' to name the enclosing class}} 66c19f959d7fa5303f2fff5fa7a4968361cb7ef068Fariborz Jahanian}; 67333de066a0c018170142150d563f3acdb2ad80f2Douglas Gregor 68333de066a0c018170142150d563f3acdb2ad80f2Douglas Gregornamespace PR6421 { 69333de066a0c018170142150d563f3acdb2ad80f2Douglas Gregor class T; // expected-note{{forward declaration}} 70333de066a0c018170142150d563f3acdb2ad80f2Douglas Gregor 71200b2921390bd75a659be3c77011e9a5548b7273Douglas Gregor class QGenericArgument // expected-note{{declared here}} 72333de066a0c018170142150d563f3acdb2ad80f2Douglas Gregor { 73333de066a0c018170142150d563f3acdb2ad80f2Douglas Gregor template<typename U> 74333de066a0c018170142150d563f3acdb2ad80f2Douglas Gregor void foo(T t) // expected-error{{variable has incomplete type}} 75333de066a0c018170142150d563f3acdb2ad80f2Douglas Gregor { } 76333de066a0c018170142150d563f3acdb2ad80f2Douglas Gregor 77333de066a0c018170142150d563f3acdb2ad80f2Douglas Gregor void disconnect() 78333de066a0c018170142150d563f3acdb2ad80f2Douglas Gregor { 79333de066a0c018170142150d563f3acdb2ad80f2Douglas Gregor T* t; 80200b2921390bd75a659be3c77011e9a5548b7273Douglas Gregor bob<QGenericArgument>(t); // expected-error{{undeclared identifier 'bob'}} \ 81200b2921390bd75a659be3c77011e9a5548b7273Douglas Gregor // expected-error{{does not refer to a value}} 82333de066a0c018170142150d563f3acdb2ad80f2Douglas Gregor } 83333de066a0c018170142150d563f3acdb2ad80f2Douglas Gregor }; 84333de066a0c018170142150d563f3acdb2ad80f2Douglas Gregor} 859c127392efe91dadacbe28ca16b8a9a5fa7990b3Douglas Gregor 869c127392efe91dadacbe28ca16b8a9a5fa7990b3Douglas Gregornamespace PR6709 { 87651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#ifdef MSABI 88651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // This bug, "Clang instantiates destructor for function argument" is intended 89651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // behaviour in the Microsoft ABI because the callee needs to destruct the arguments. 90651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // expected-error@+3 {{indirection requires pointer operand ('int' invalid)}} 91651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // expected-note@+3 {{in instantiation of member function 'PR6709::X<int>::~X' requested here}} 92651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#endif 939c127392efe91dadacbe28ca16b8a9a5fa7990b3Douglas Gregor template<class T> class X { T v; ~X() { ++*v; } }; 949c127392efe91dadacbe28ca16b8a9a5fa7990b3Douglas Gregor void a(X<int> x) {} 959c127392efe91dadacbe28ca16b8a9a5fa7990b3Douglas Gregor} 96d92ec474faeb6133e0d41f0de4526b22778476f2Douglas Gregor 97d92ec474faeb6133e0d41f0de4526b22778476f2Douglas Gregorstruct X0 { virtual ~X0() throw(); }; 98d92ec474faeb6133e0d41f0de4526b22778476f2Douglas Gregorstruct X1 : public X0 { }; 995efd91a3b58e59006f8a3e8c9256ec00c38dba95John McCall 1005efd91a3b58e59006f8a3e8c9256ec00c38dba95John McCall// Make sure we instantiate operator deletes when building a virtual 1015efd91a3b58e59006f8a3e8c9256ec00c38dba95John McCall// destructor. 1025efd91a3b58e59006f8a3e8c9256ec00c38dba95John McCallnamespace test6 { 1035efd91a3b58e59006f8a3e8c9256ec00c38dba95John McCall template <class T> class A { 1045efd91a3b58e59006f8a3e8c9256ec00c38dba95John McCall public: 1056b855121f3c23e9cf2b548cbf2dd3d16fdcf610cBenjamin Kramer void *operator new(__SIZE_TYPE__); 1065efd91a3b58e59006f8a3e8c9256ec00c38dba95John McCall void operator delete(void *p) { 1075efd91a3b58e59006f8a3e8c9256ec00c38dba95John McCall T::deleteIt(p); // expected-error {{type 'int' cannot be used prior to '::'}} 1085efd91a3b58e59006f8a3e8c9256ec00c38dba95John McCall } 1095efd91a3b58e59006f8a3e8c9256ec00c38dba95John McCall 110651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#ifdef MSABI 111651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // expected-note@+2 {{in instantiation of member function 'test6::A<int>::operator delete' requested here}} 112651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#endif 1132a5f99eb4e2af771faacfceb9f78e230129c5e5aNick Lewycky virtual ~A() {} 1145efd91a3b58e59006f8a3e8c9256ec00c38dba95John McCall }; 1155efd91a3b58e59006f8a3e8c9256ec00c38dba95John McCall 116651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#ifndef MSABI 117651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // expected-note@+2 {{in instantiation of member function 'test6::A<int>::operator delete' requested here}} 118651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#endif 119651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines class B : A<int> { B(); }; 1202a5f99eb4e2af771faacfceb9f78e230129c5e5aNick Lewycky B::B() {} 1215efd91a3b58e59006f8a3e8c9256ec00c38dba95John McCall} 122fcadea2556be268121a6216e367bbe3598c4008eJohn McCall 123fcadea2556be268121a6216e367bbe3598c4008eJohn McCall// Make sure classes are marked invalid when they have invalid 124fcadea2556be268121a6216e367bbe3598c4008eJohn McCall// members. This avoids a crash-on-invalid. 125fcadea2556be268121a6216e367bbe3598c4008eJohn McCallnamespace test7 { 126fcadea2556be268121a6216e367bbe3598c4008eJohn McCall struct A { 127fcadea2556be268121a6216e367bbe3598c4008eJohn McCall ~A() const; // expected-error {{'const' qualifier is not allowed on a destructor}} 128fcadea2556be268121a6216e367bbe3598c4008eJohn McCall }; 129fcadea2556be268121a6216e367bbe3598c4008eJohn McCall struct B : A {}; 130fcadea2556be268121a6216e367bbe3598c4008eJohn McCall 131fcadea2556be268121a6216e367bbe3598c4008eJohn McCall void test() { 132fcadea2556be268121a6216e367bbe3598c4008eJohn McCall B *b; 133fcadea2556be268121a6216e367bbe3598c4008eJohn McCall b->~B(); 134fcadea2556be268121a6216e367bbe3598c4008eJohn McCall } 135fcadea2556be268121a6216e367bbe3598c4008eJohn McCall} 136def4e2a405a15eb8381ca305725285d27a4bab65Argyrios Kyrtzidis 137def4e2a405a15eb8381ca305725285d27a4bab65Argyrios Kyrtzidisnamespace nonvirtualdtor { 138def4e2a405a15eb8381ca305725285d27a4bab65Argyrios Kyrtzidisstruct S1 { // expected-warning {{has virtual functions but non-virtual destructor}} 139def4e2a405a15eb8381ca305725285d27a4bab65Argyrios Kyrtzidis virtual void m(); 140def4e2a405a15eb8381ca305725285d27a4bab65Argyrios Kyrtzidis}; 141def4e2a405a15eb8381ca305725285d27a4bab65Argyrios Kyrtzidis 142def4e2a405a15eb8381ca305725285d27a4bab65Argyrios Kyrtzidisstruct S2 { 143def4e2a405a15eb8381ca305725285d27a4bab65Argyrios Kyrtzidis ~S2(); // expected-warning {{has virtual functions but non-virtual destructor}} 144def4e2a405a15eb8381ca305725285d27a4bab65Argyrios Kyrtzidis virtual void m(); 145def4e2a405a15eb8381ca305725285d27a4bab65Argyrios Kyrtzidis}; 146def4e2a405a15eb8381ca305725285d27a4bab65Argyrios Kyrtzidis 147def4e2a405a15eb8381ca305725285d27a4bab65Argyrios Kyrtzidisstruct S3 : public S1 { // expected-warning {{has virtual functions but non-virtual destructor}} 148def4e2a405a15eb8381ca305725285d27a4bab65Argyrios Kyrtzidis virtual void m(); 149def4e2a405a15eb8381ca305725285d27a4bab65Argyrios Kyrtzidis}; 150def4e2a405a15eb8381ca305725285d27a4bab65Argyrios Kyrtzidis 151def4e2a405a15eb8381ca305725285d27a4bab65Argyrios Kyrtzidisstruct S4 : public S2 { // expected-warning {{has virtual functions but non-virtual destructor}} 152def4e2a405a15eb8381ca305725285d27a4bab65Argyrios Kyrtzidis virtual void m(); 153def4e2a405a15eb8381ca305725285d27a4bab65Argyrios Kyrtzidis}; 154def4e2a405a15eb8381ca305725285d27a4bab65Argyrios Kyrtzidis 155def4e2a405a15eb8381ca305725285d27a4bab65Argyrios Kyrtzidisstruct B { 156def4e2a405a15eb8381ca305725285d27a4bab65Argyrios Kyrtzidis virtual ~B(); 157def4e2a405a15eb8381ca305725285d27a4bab65Argyrios Kyrtzidis virtual void m(); 158def4e2a405a15eb8381ca305725285d27a4bab65Argyrios Kyrtzidis}; 159def4e2a405a15eb8381ca305725285d27a4bab65Argyrios Kyrtzidis 160def4e2a405a15eb8381ca305725285d27a4bab65Argyrios Kyrtzidisstruct S5 : public B { 161def4e2a405a15eb8381ca305725285d27a4bab65Argyrios Kyrtzidis virtual void m(); 162def4e2a405a15eb8381ca305725285d27a4bab65Argyrios Kyrtzidis}; 1639641fc8e43f53b1ae8ed7742017e0a320d75fa8aArgyrios Kyrtzidis 1649641fc8e43f53b1ae8ed7742017e0a320d75fa8aArgyrios Kyrtzidisstruct S6 { 1659641fc8e43f53b1ae8ed7742017e0a320d75fa8aArgyrios Kyrtzidis virtual void m(); 1669641fc8e43f53b1ae8ed7742017e0a320d75fa8aArgyrios Kyrtzidisprivate: 1679641fc8e43f53b1ae8ed7742017e0a320d75fa8aArgyrios Kyrtzidis ~S6(); 1689641fc8e43f53b1ae8ed7742017e0a320d75fa8aArgyrios Kyrtzidis}; 1699641fc8e43f53b1ae8ed7742017e0a320d75fa8aArgyrios Kyrtzidis 1709641fc8e43f53b1ae8ed7742017e0a320d75fa8aArgyrios Kyrtzidisstruct S7 { 1719641fc8e43f53b1ae8ed7742017e0a320d75fa8aArgyrios Kyrtzidis virtual void m(); 1729641fc8e43f53b1ae8ed7742017e0a320d75fa8aArgyrios Kyrtzidisprotected: 1739641fc8e43f53b1ae8ed7742017e0a320d75fa8aArgyrios Kyrtzidis ~S7(); 1749641fc8e43f53b1ae8ed7742017e0a320d75fa8aArgyrios Kyrtzidis}; 175668fdd8578c85aa2692ffdeb7614acabf1aaab25Argyrios Kyrtzidis 176668fdd8578c85aa2692ffdeb7614acabf1aaab25Argyrios Kyrtzidistemplate<class T> class TS : public B { 177668fdd8578c85aa2692ffdeb7614acabf1aaab25Argyrios Kyrtzidis virtual void m(); 178668fdd8578c85aa2692ffdeb7614acabf1aaab25Argyrios Kyrtzidis}; 179668fdd8578c85aa2692ffdeb7614acabf1aaab25Argyrios Kyrtzidis 180668fdd8578c85aa2692ffdeb7614acabf1aaab25Argyrios KyrtzidisTS<int> baz; 181668fdd8578c85aa2692ffdeb7614acabf1aaab25Argyrios Kyrtzidis 182668fdd8578c85aa2692ffdeb7614acabf1aaab25Argyrios Kyrtzidistemplate<class T> class TS2 { // expected-warning {{'nonvirtualdtor::TS2<int>' has virtual functions but non-virtual destructor}} 183668fdd8578c85aa2692ffdeb7614acabf1aaab25Argyrios Kyrtzidis virtual void m(); 184668fdd8578c85aa2692ffdeb7614acabf1aaab25Argyrios Kyrtzidis}; 185668fdd8578c85aa2692ffdeb7614acabf1aaab25Argyrios Kyrtzidis 186668fdd8578c85aa2692ffdeb7614acabf1aaab25Argyrios KyrtzidisTS2<int> foo; // expected-note {{instantiation}} 187def4e2a405a15eb8381ca305725285d27a4bab65Argyrios Kyrtzidis} 188f4b793ceb60418b64d3593ba3c8240e3594bff8fDouglas Gregor 1896f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidisnamespace dnvd { // delete-non-virtual-dtor warning 1906f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidisstruct NP {}; 1916f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis 1926f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidisstruct B { // expected-warning {{has virtual functions but non-virtual destructor}} 1936f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis virtual void foo(); 1946f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis}; 1956f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis 1966f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidisstruct D: B {}; // expected-warning {{has virtual functions but non-virtual destructor}} 1976f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis 1986bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesstruct F final : B {}; 1996f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis 2006f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidisstruct VB { 2016f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis virtual void foo(); 2026f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis virtual ~VB(); 2036f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis}; 2046f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis 2056f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidisstruct VD: VB {}; 2066f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis 2076f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidisstruct VF final: VB {}; 2086f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis 2096f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidistemplate <typename T> 2106f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidisclass simple_ptr { 2116f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidispublic: 2126f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis simple_ptr(T* t): _ptr(t) {} 2136f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis ~simple_ptr() { delete _ptr; } // \ 2146f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis // expected-warning {{delete called on 'dnvd::B' that has virtual functions but non-virtual destructor}} \ 2156f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis // expected-warning {{delete called on 'dnvd::D' that has virtual functions but non-virtual destructor}} 2166f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis T& operator*() const { return *_ptr; } 2176f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidisprivate: 2186f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis T* _ptr; 2196f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis}; 2206f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis 2216f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidistemplate <typename T> 2226f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidisclass simple_ptr2 { 2236f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidispublic: 2246f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis simple_ptr2(T* t): _ptr(t) {} 2256f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis ~simple_ptr2() { delete _ptr; } // expected-warning {{delete called on 'dnvd::B' that has virtual functions but non-virtual destructor}} 2266f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis T& operator*() const { return *_ptr; } 2276f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidisprivate: 2286f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis T* _ptr; 2296f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis}; 2306f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis 2316f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidisvoid use(B&); 2326f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidisvoid use(VB&); 2336f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis 2346f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidisvoid nowarnstack() { 2356f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis B b; use(b); 2366f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis D d; use(d); 2376f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis F f; use(f); 2386f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis VB vb; use(vb); 2396f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis VD vd; use(vd); 2406f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis VF vf; use(vf); 2416f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis} 2426f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis 2436f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidisvoid nowarnnonpoly() { 2446f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis { 2456f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis NP* np = new NP(); 2466f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis delete np; 2476f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis } 2486f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis { 2496f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis NP* np = new NP[4]; 2506f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis delete[] np; 2516f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis } 2526f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis} 2536f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis 2546f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidisvoid nowarnarray() { 2556f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis { 2566f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis B* b = new B[4]; 2576f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis delete[] b; 2586f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis } 2596f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis { 2606f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis D* d = new D[4]; 2616f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis delete[] d; 2626f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis } 2636f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis { 2646f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis VB* vb = new VB[4]; 2656f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis delete[] vb; 2666f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis } 2676f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis { 2686f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis VD* vd = new VD[4]; 2696f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis delete[] vd; 2706f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis } 2716f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis} 2726f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis 2736f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidistemplate <typename T> 2746f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidisvoid nowarntemplate() { 2756f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis { 2766f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis T* t = new T(); 2776f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis delete t; 2786f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis } 2796f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis { 2806f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis T* t = new T[4]; 2816f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis delete[] t; 2826f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis } 2836f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis} 2846f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis 2856f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidisvoid nowarn0() { 2866f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis { 2876f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis F* f = new F(); 2886f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis delete f; 2896f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis } 2906f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis { 2916f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis VB* vb = new VB(); 2926f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis delete vb; 2936f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis } 2946f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis { 2956f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis VB* vb = new VD(); 2966f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis delete vb; 2976f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis } 2986f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis { 2996f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis VD* vd = new VD(); 3006f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis delete vd; 3016f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis } 3026f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis { 3036f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis VF* vf = new VF(); 3046f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis delete vf; 3056f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis } 3066f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis} 3076f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis 3086f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidisvoid warn0() { 3096f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis { 3106f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis B* b = new B(); 3116f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis delete b; // expected-warning {{delete called on 'dnvd::B' that has virtual functions but non-virtual destructor}} 3126f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis } 3136f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis { 3146f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis B* b = new D(); 3156f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis delete b; // expected-warning {{delete called on 'dnvd::B' that has virtual functions but non-virtual destructor}} 3166f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis } 3176f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis { 3186f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis D* d = new D(); 3196f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis delete d; // expected-warning {{delete called on 'dnvd::D' that has virtual functions but non-virtual destructor}} 3206f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis } 3216f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis} 3226f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis 3236f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidisvoid nowarn1() { 3246f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis { 3256f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis simple_ptr<F> f(new F()); 3266f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis use(*f); 3276f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis } 3286f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis { 3296f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis simple_ptr<VB> vb(new VB()); 3306f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis use(*vb); 3316f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis } 3326f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis { 3336f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis simple_ptr<VB> vb(new VD()); 3346f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis use(*vb); 3356f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis } 3366f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis { 3376f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis simple_ptr<VD> vd(new VD()); 3386f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis use(*vd); 3396f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis } 3406f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis { 3416f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis simple_ptr<VF> vf(new VF()); 3426f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis use(*vf); 3436f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis } 3446f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis} 3456f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis 3466f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidisvoid warn1() { 3476f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis { 3486f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis simple_ptr<B> b(new B()); // expected-note {{in instantiation of member function 'dnvd::simple_ptr<dnvd::B>::~simple_ptr' requested here}} 3496f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis use(*b); 3506f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis } 3516f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis { 3526f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis simple_ptr2<B> b(new D()); // expected-note {{in instantiation of member function 'dnvd::simple_ptr2<dnvd::B>::~simple_ptr2' requested here}} 3536f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis use(*b); 3546f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis } 3556f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis { 3566f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis simple_ptr<D> d(new D()); // expected-note {{in instantiation of member function 'dnvd::simple_ptr<dnvd::D>::~simple_ptr' requested here}} 3576f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis use(*d); 3586f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis } 3596f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis} 3606f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis} 3616f0074ae2f466bae9f415da268d61a2dc1fabe26Argyrios Kyrtzidis 362f4b793ceb60418b64d3593ba3c8240e3594bff8fDouglas Gregornamespace PR9238 { 363f4b793ceb60418b64d3593ba3c8240e3594bff8fDouglas Gregor class B { public: ~B(); }; 364f4b793ceb60418b64d3593ba3c8240e3594bff8fDouglas Gregor class C : virtual B { public: ~C() { } }; 365f4b793ceb60418b64d3593ba3c8240e3594bff8fDouglas Gregor} 3667ec1873d694cf870264694d2b61219a03492bc30Douglas Gregor 3677ec1873d694cf870264694d2b61219a03492bc30Douglas Gregornamespace PR7900 { 3687ec1873d694cf870264694d2b61219a03492bc30Douglas Gregor struct A { // expected-note 2{{type 'PR7900::A' is declared here}} 3697ec1873d694cf870264694d2b61219a03492bc30Douglas Gregor }; 3707ec1873d694cf870264694d2b61219a03492bc30Douglas Gregor struct B : public A { 3717ec1873d694cf870264694d2b61219a03492bc30Douglas Gregor }; 3727ec1873d694cf870264694d2b61219a03492bc30Douglas Gregor void foo() { 3737ec1873d694cf870264694d2b61219a03492bc30Douglas Gregor B b; 3747ec1873d694cf870264694d2b61219a03492bc30Douglas Gregor b.~B(); 3757ec1873d694cf870264694d2b61219a03492bc30Douglas Gregor b.~A(); // expected-error{{destructor type 'PR7900::A' in object destruction expression does not match the type 'PR7900::B' of the object being destroyed}} 3767ec1873d694cf870264694d2b61219a03492bc30Douglas Gregor (&b)->~A(); // expected-error{{destructor type 'PR7900::A' in object destruction expression does not match the type 'PR7900::B' of the object being destroyed}} 3777ec1873d694cf870264694d2b61219a03492bc30Douglas Gregor } 3787ec1873d694cf870264694d2b61219a03492bc30Douglas Gregor} 3796e04a849fec62c15968f8a1c94ac380f5eae7b99Benjamin Kramer 3806e04a849fec62c15968f8a1c94ac380f5eae7b99Benjamin Kramernamespace PR16892 { 3816e04a849fec62c15968f8a1c94ac380f5eae7b99Benjamin Kramer auto p = &A::~A; // expected-error{{taking the address of a destructor}} 3826e04a849fec62c15968f8a1c94ac380f5eae7b99Benjamin Kramer} 383ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 384ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesnamespace PR20238 { 385ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesstruct S { 386ef8225444452a1486bd721f3285301fe84643b00Stephen Hines volatile ~S() { } // expected-error{{destructor cannot have a return type}} 387ef8225444452a1486bd721f3285301fe84643b00Stephen Hines}; 388ef8225444452a1486bd721f3285301fe84643b00Stephen Hines} 389