1a5728872c7702ddd09537c95bc3cbd20e1f2fb09Daniel Dunbar// RUN: %clang_cc1 -fsyntax-only -verify %s 2c87efbd2cbd13e68ea771275f03d1bbd1b741e47Fariborz Jahanian 3c87efbd2cbd13e68ea771275f03d1bbd1b741e47Fariborz Jahaniantemplate<typename A> class s0 { 4c87efbd2cbd13e68ea771275f03d1bbd1b741e47Fariborz Jahanian 5c87efbd2cbd13e68ea771275f03d1bbd1b741e47Fariborz Jahanian template<typename B> class s1 : public s0<A> { 6c87efbd2cbd13e68ea771275f03d1bbd1b741e47Fariborz Jahanian ~s1() {} 7c87efbd2cbd13e68ea771275f03d1bbd1b741e47Fariborz Jahanian s0<A> ms0; 8c87efbd2cbd13e68ea771275f03d1bbd1b741e47Fariborz Jahanian }; 9c87efbd2cbd13e68ea771275f03d1bbd1b741e47Fariborz Jahanian 10c87efbd2cbd13e68ea771275f03d1bbd1b741e47Fariborz Jahanian}; 11c87efbd2cbd13e68ea771275f03d1bbd1b741e47Fariborz Jahanian 1231658dfe908d07666e2820ced8443a9a1988f1ebDouglas Gregorstruct Incomplete; 13c87efbd2cbd13e68ea771275f03d1bbd1b741e47Fariborz Jahanian 1431658dfe908d07666e2820ced8443a9a1988f1ebDouglas Gregortemplate<typename T> 1531658dfe908d07666e2820ced8443a9a1988f1ebDouglas Gregorvoid destroy_me(T me) { 1631658dfe908d07666e2820ced8443a9a1988f1ebDouglas Gregor me.~T(); 1731658dfe908d07666e2820ced8443a9a1988f1ebDouglas Gregor} 1831658dfe908d07666e2820ced8443a9a1988f1ebDouglas Gregor 1931658dfe908d07666e2820ced8443a9a1988f1ebDouglas Gregortemplate void destroy_me(Incomplete*); 20124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor 21124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregornamespace PR6152 { 22124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor template<typename T> struct X { void f(); }; 23124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor template<typename T> struct Y { }; 24124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor template<typename T> 25124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor void X<T>::f() { 26124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor Y<T> *y; 27124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor y->template Y<T>::~Y(); 28a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor y->template Y<T>::~Y<T>(); 29a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor y->~Y(); 30124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor } 31124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor 32124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor template struct X<int>; 33124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor} 34124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor 3520b3c9dda95e6808865110a21bfec25f95ebcaa7Douglas Gregornamespace cvquals { 3620b3c9dda95e6808865110a21bfec25f95ebcaa7Douglas Gregor template<typename T> 3720b3c9dda95e6808865110a21bfec25f95ebcaa7Douglas Gregor void f(int *ptr) { 3820b3c9dda95e6808865110a21bfec25f95ebcaa7Douglas Gregor ptr->~T(); 3920b3c9dda95e6808865110a21bfec25f95ebcaa7Douglas Gregor } 4020b3c9dda95e6808865110a21bfec25f95ebcaa7Douglas Gregor 4120b3c9dda95e6808865110a21bfec25f95ebcaa7Douglas Gregor template void f<const volatile int>(int *); 4220b3c9dda95e6808865110a21bfec25f95ebcaa7Douglas Gregor} 439f716e4140da8d18165a702f81d2286a12e83a8cDouglas Gregor 449f716e4140da8d18165a702f81d2286a12e83a8cDouglas Gregornamespace PR7239 { 459f716e4140da8d18165a702f81d2286a12e83a8cDouglas Gregor template<class E> class A { }; 469f716e4140da8d18165a702f81d2286a12e83a8cDouglas Gregor class B { 479f716e4140da8d18165a702f81d2286a12e83a8cDouglas Gregor void f() { 489f716e4140da8d18165a702f81d2286a12e83a8cDouglas Gregor A<int>* x; 499f716e4140da8d18165a702f81d2286a12e83a8cDouglas Gregor x->A<int>::~A<int>(); 509f716e4140da8d18165a702f81d2286a12e83a8cDouglas Gregor } 519f716e4140da8d18165a702f81d2286a12e83a8cDouglas Gregor }; 529f716e4140da8d18165a702f81d2286a12e83a8cDouglas Gregor} 53cb710a4df50b79659399f0722ea29e90251ea834Douglas Gregor 54cb710a4df50b79659399f0722ea29e90251ea834Douglas Gregornamespace PR7904 { 55cb710a4df50b79659399f0722ea29e90251ea834Douglas Gregor struct Foo { 56cb710a4df50b79659399f0722ea29e90251ea834Douglas Gregor template <int i> ~Foo() {} // expected-error{{destructor cannot be declared as a template}} 57cb710a4df50b79659399f0722ea29e90251ea834Douglas Gregor }; 58cb710a4df50b79659399f0722ea29e90251ea834Douglas Gregor Foo f; 59cb710a4df50b79659399f0722ea29e90251ea834Douglas Gregor} 60