| // RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s |
| |
| template<typename A> class s0 { |
| |
| template<typename B> class s1 : public s0<A> { |
| ~s1() {} |
| s0<A> ms0; |
| }; |
| |
| }; |
| |
| struct Incomplete; |
| |
| template<typename T> |
| void destroy_me(T me) { |
| me.~T(); |
| } |
| |
| template void destroy_me(Incomplete*); |
| |
| namespace PR6152 { |
| template<typename T> struct X { void f(); }; |
| template<typename T> struct Y { }; |
| template<typename T> |
| void X<T>::f() { |
| Y<T> *y; |
| y->template Y<T>::~Y(); |
| y->template Y<T>::~Y<T>(); |
| y->~Y(); |
| } |
| |
| template struct X<int>; |
| } |
| |
| namespace cvquals { |
| template<typename T> |
| void f(int *ptr) { |
| ptr->~T(); |
| } |
| |
| template void f<const volatile int>(int *); |
| } |
| |
| namespace PR7239 { |
| template<class E> class A { }; |
| class B { |
| void f() { |
| A<int>* x; |
| x->A<int>::~A<int>(); |
| } |
| }; |
| } |
| |
| namespace PR7904 { |
| struct Foo {}; |
| template <class T> |
| Foo::~Foo() { // expected-error{{destructor cannot be declared as a template}} |
| T t; |
| T &pT = t; |
| pT; |
| } |
| Foo f; |
| } |
| |
| namespace rdar13140795 { |
| template <class T> class shared_ptr {}; |
| |
| template <typename T> struct Marshal { |
| static int gc(); |
| }; |
| |
| |
| template <typename T> int Marshal<T>::gc() { |
| shared_ptr<T> *x; |
| x->template shared_ptr<T>::~shared_ptr(); |
| return 0; |
| } |
| |
| void test() { |
| Marshal<int>::gc(); |
| } |
| } |
| |
| namespace PR16852 { |
| template<typename T> struct S { int a; T x; }; |
| template<typename T> decltype(S<T>().~S()) f(); // expected-note {{candidate template ignored: couldn't infer template argument 'T'}} |
| void g() { f(); } // expected-error {{no matching function for call to 'f'}} |
| } |
| |
| class PR33189 |
| { |
| template <class T> |
| ~PR33189() { } // expected-error{{destructor cannot be declared as a template}} |
| }; |