xref: /aosp_15_r20/external/clang/test/SemaTemplate/destructor-template.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
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 Li void 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