destructor.cpp revision 333de066a0c018170142150d563f3acdb2ad80f2
1a5728872c7702ddd09537c95bc3cbd20e1f2fb09Daniel Dunbar// RUN: %clang_cc1 -fsyntax-only -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}}   \
2242a552f8200ba5948661aee0106fce0c04e39818Douglas Gregor    // expected-error{{destructor cannot be variadic}}
2342a552f8200ba5948661aee0106fce0c04e39818Douglas Gregor};
2442a552f8200ba5948661aee0106fce0c04e39818Douglas Gregor
256540180c2fd7a5b4963b22dc81461b73927499a8Chris Lattnerstruct D2 {
266540180c2fd7a5b4963b22dc81461b73927499a8Chris Lattner  void ~D2() { } //                          \
276540180c2fd7a5b4963b22dc81461b73927499a8Chris Lattner  // expected-error{{destructor cannot have a return type}}
286540180c2fd7a5b4963b22dc81461b73927499a8Chris Lattner};
296540180c2fd7a5b4963b22dc81461b73927499a8Chris Lattner
30eaaebc7cf10dc1a2016183a262ad3256bc468759Chris Lattner
3142a552f8200ba5948661aee0106fce0c04e39818Douglas Gregorstruct E;
3242a552f8200ba5948661aee0106fce0c04e39818Douglas Gregor
3342a552f8200ba5948661aee0106fce0c04e39818Douglas Gregortypedef E E_typedef;
3442a552f8200ba5948661aee0106fce0c04e39818Douglas Gregorstruct E {
35d0344a4a6182ad704881cbbaa21cca14913d2296Chris Lattner  ~E_typedef(); // expected-error{{destructor cannot be declared using a typedef 'E_typedef' (aka 'struct E') of the class name}}
3642a552f8200ba5948661aee0106fce0c04e39818Douglas Gregor};
3742a552f8200ba5948661aee0106fce0c04e39818Douglas Gregor
3842a552f8200ba5948661aee0106fce0c04e39818Douglas Gregorstruct F {
395f4a6829dc58cab2f76e2b98492859aa3b91e3f2Chris Lattner  (~F)(); // expected-note {{previous declaration is here}}
405f4a6829dc58cab2f76e2b98492859aa3b91e3f2Chris Lattner  ~F(); // expected-error {{destructor cannot be redeclared}}
4142a552f8200ba5948661aee0106fce0c04e39818Douglas Gregor};
4242a552f8200ba5948661aee0106fce0c04e39818Douglas Gregor
43124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor~; // expected-error {{expected a class name after '~' to name a destructor}}
4476ed9cb1d7398bb721cb9df67b3004c14dae8aa8Fariborz Jahanian~undef(); // expected-error {{expected the class name after '~' to name a destructor}}
45124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor~operator+(int, int);  // expected-error {{expected a class name after '~' to name a destructor}}
46c7ed9c60b8ee04b119e23441cae2cfec74536ba9Argyrios Kyrtzidis~F(){} // expected-error {{destructor must be a non-static member function}}
479d35097bc0fefb2f77638be513cac72d1c09d840Douglas Gregor
489d35097bc0fefb2f77638be513cac72d1c09d840Douglas Gregorstruct G {
499d35097bc0fefb2f77638be513cac72d1c09d840Douglas Gregor  ~G();
509d35097bc0fefb2f77638be513cac72d1c09d840Douglas Gregor};
519d35097bc0fefb2f77638be513cac72d1c09d840Douglas Gregor
529d35097bc0fefb2f77638be513cac72d1c09d840Douglas GregorG::~G() { }
539d35097bc0fefb2f77638be513cac72d1c09d840Douglas Gregor
547786d1c5d752b90ff74093bd1ffda37daf0dbe6eAnders Carlsson// <rdar://problem/6841210>
557786d1c5d752b90ff74093bd1ffda37daf0dbe6eAnders Carlssonstruct H {
567786d1c5d752b90ff74093bd1ffda37daf0dbe6eAnders Carlsson  ~H(void) { }
577786d1c5d752b90ff74093bd1ffda37daf0dbe6eAnders Carlsson};
58c19f959d7fa5303f2fff5fa7a4968361cb7ef068Fariborz Jahanian
59c19f959d7fa5303f2fff5fa7a4968361cb7ef068Fariborz Jahanianstruct X {};
60c19f959d7fa5303f2fff5fa7a4968361cb7ef068Fariborz Jahanian
61c19f959d7fa5303f2fff5fa7a4968361cb7ef068Fariborz Jahanianstruct Y {
62c19f959d7fa5303f2fff5fa7a4968361cb7ef068Fariborz Jahanian  ~X(); // expected-error {{expected the class name after '~' to name the enclosing class}}
63c19f959d7fa5303f2fff5fa7a4968361cb7ef068Fariborz Jahanian};
64333de066a0c018170142150d563f3acdb2ad80f2Douglas Gregor
65333de066a0c018170142150d563f3acdb2ad80f2Douglas Gregornamespace PR6421 {
66333de066a0c018170142150d563f3acdb2ad80f2Douglas Gregor  class T; // expected-note{{forward declaration}}
67333de066a0c018170142150d563f3acdb2ad80f2Douglas Gregor
68333de066a0c018170142150d563f3acdb2ad80f2Douglas Gregor  class QGenericArgument
69333de066a0c018170142150d563f3acdb2ad80f2Douglas Gregor  {
70333de066a0c018170142150d563f3acdb2ad80f2Douglas Gregor    template<typename U>
71333de066a0c018170142150d563f3acdb2ad80f2Douglas Gregor    void foo(T t) // expected-error{{variable has incomplete type}}
72333de066a0c018170142150d563f3acdb2ad80f2Douglas Gregor    { }
73333de066a0c018170142150d563f3acdb2ad80f2Douglas Gregor
74333de066a0c018170142150d563f3acdb2ad80f2Douglas Gregor    void disconnect()
75333de066a0c018170142150d563f3acdb2ad80f2Douglas Gregor    {
76333de066a0c018170142150d563f3acdb2ad80f2Douglas Gregor      T* t;
77333de066a0c018170142150d563f3acdb2ad80f2Douglas Gregor      bob<QGenericArgument>(t); // expected-error{{undeclared identifier 'bob'}}
78333de066a0c018170142150d563f3acdb2ad80f2Douglas Gregor    }
79333de066a0c018170142150d563f3acdb2ad80f2Douglas Gregor  };
80333de066a0c018170142150d563f3acdb2ad80f2Douglas Gregor}
81