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