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