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