1// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s 2 3template<typename A> class s0 { 4 5 template<typename B> class s1 : public s0<A> { 6 ~s1() {} 7 s0<A> ms0; 8 }; 9 10}; 11 12struct Incomplete; 13 14template<typename T> 15void destroy_me(T me) { 16 me.~T(); 17} 18 19template void destroy_me(Incomplete*); 20 21namespace PR6152 { 22 template<typename T> struct X { void f(); }; 23 template<typename T> struct Y { }; 24 template<typename T> 25 void X<T>::f() { 26 Y<T> *y; 27 y->template Y<T>::~Y(); 28 y->template Y<T>::~Y<T>(); 29 y->~Y(); 30 } 31 32 template struct X<int>; 33} 34 35namespace cvquals { 36 template<typename T> 37 void f(int *ptr) { 38 ptr->~T(); 39 } 40 41 template void f<const volatile int>(int *); 42} 43 44namespace PR7239 { 45 template<class E> class A { }; 46 class B { 47 void f() { 48 A<int>* x; 49 x->A<int>::~A<int>(); 50 } 51 }; 52} 53 54namespace PR7904 { 55 struct Foo {}; 56 template <class T> 57 Foo::~Foo() { // expected-error{{destructor cannot be declared as a template}} 58 T t; 59 T &pT = t; 60 pT; 61 } 62 Foo f; 63} 64 65namespace rdar13140795 { 66 template <class T> class shared_ptr {}; 67 68 template <typename T> struct Marshal { 69 static int gc(); 70 }; 71 72 73 template <typename T> int Marshal<T>::gc() { 74 shared_ptr<T> *x; 75 x->template shared_ptr<T>::~shared_ptr(); 76 return 0; 77 } 78 79 void test() { 80 Marshal<int>::gc(); 81 } 82} 83 84namespace PR16852 { 85 template<typename T> struct S { int a; T x; }; 86 template<typename T> decltype(S<T>().~S()) f(); // expected-note {{candidate template ignored: couldn't infer template argument 'T'}} 87 void g() { f(); } // expected-error {{no matching function for call to 'f'}} 88} 89