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