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