pseudo-destructors.cpp revision b10cd04880672103660e5844e51ee91af7361a20
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// RUN: %clang_cc1 -fsyntax-only -verify %s
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstruct A {};
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectenum Foo { F };
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projecttypedef Foo Bar;
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projecttypedef int Integer;
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projecttypedef double Double;
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid g();
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace N {
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  typedef Foo Wibble;
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid f(A* a, Foo *f, int *i, double *d) {
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  a->~A();
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  a->A::~A();
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  a->~foo(); // expected-error{{identifier 'foo' in pseudo-destructor expression does not name a type}}
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  // FIXME: the diagnostic below isn't wonderful
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  a->~Bar(); // expected-error{{does not name a type}}
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  f->~Bar();
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  f->~Foo();
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  i->~Bar(); // expected-error{{does not match}}
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  g().~Bar(); // expected-error{{non-scalar}}
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  f->::~Bar();
32f360acf8759d5eedc2b4110c721c8d1a3262470cJames Dong  f->N::~Wibble(); // FIXME: Cannot use typedef name in destructor id.
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34f360acf8759d5eedc2b4110c721c8d1a3262470cJames Dong  f->::~Bar(17, 42); // expected-error{{cannot have any arguments}}
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  i->~Integer();
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  i->Integer::~Integer();
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  i->Integer::~Double(); // expected-error{{the type of object expression ('int') does not match the type being destroyed ('double') in pseudo-destructor expression}}
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projecttypedef int Integer;
43f360acf8759d5eedc2b4110c721c8d1a3262470cJames Dong
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid destroy_without_call(int *ip) {
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  ip->~Integer; // expected-error{{called immediately}}
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
48f360acf8759d5eedc2b4110c721c8d1a3262470cJames Dong// PR5530
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace N1 {
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  class X0 { };
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid test_X0(N1::X0 &x0) {
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  x0.~X0();
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project