xref: /aosp_15_r20/external/clang/test/SemaTemplate/instantiate-member-template.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -fsyntax-only -verify %s
2*67e74705SXin Li 
3*67e74705SXin Li template<typename T>
4*67e74705SXin Li struct X0 {
5*67e74705SXin Li   template<typename U> T f0(U);
6*67e74705SXin Li   template<typename U> U& f1(T*, U); // expected-error{{pointer to a reference}} \
7*67e74705SXin Li                                      // expected-note{{candidate}}
8*67e74705SXin Li };
9*67e74705SXin Li 
10*67e74705SXin Li X0<int> x0i;
11*67e74705SXin Li X0<void> x0v;
12*67e74705SXin Li X0<int&> x0ir; // expected-note{{instantiation}}
13*67e74705SXin Li 
test_X0(int * ip,double * dp)14*67e74705SXin Li void test_X0(int *ip, double *dp) {
15*67e74705SXin Li   X0<int> xi;
16*67e74705SXin Li   int i1 = xi.f0(ip);
17*67e74705SXin Li   double *&dpr = xi.f1(ip, dp);
18*67e74705SXin Li   xi.f1(dp, dp); // expected-error{{no matching}}
19*67e74705SXin Li 
20*67e74705SXin Li   X0<void> xv;
21*67e74705SXin Li   double *&dpr2 = xv.f1(ip, dp);
22*67e74705SXin Li }
23*67e74705SXin Li 
24*67e74705SXin Li template<typename T>
25*67e74705SXin Li struct X1 {
26*67e74705SXin Li   template<typename U>
27*67e74705SXin Li   struct Inner0 {
28*67e74705SXin Li     U x;
29*67e74705SXin Li     T y; // expected-error{{void}}
30*67e74705SXin Li   };
31*67e74705SXin Li 
32*67e74705SXin Li   template<typename U>
33*67e74705SXin Li   struct Inner1 {
34*67e74705SXin Li     U x; // expected-error{{void}}
35*67e74705SXin Li     T y;
36*67e74705SXin Li   };
37*67e74705SXin Li 
38*67e74705SXin Li   template<typename U>
39*67e74705SXin Li   struct Inner2 {
40*67e74705SXin Li     struct SuperInner {
41*67e74705SXin Li       U z; // expected-error{{void}}
42*67e74705SXin Li     };
43*67e74705SXin Li   };
44*67e74705SXin Li 
45*67e74705SXin Li   template<typename U>
46*67e74705SXin Li   struct Inner3 {
f0X1::Inner347*67e74705SXin Li     void f0(T t, U u) { // expected-note{{passing argument to parameter 't' here}}
48*67e74705SXin Li       (void)(t + u); // expected-error{{invalid operands}}
49*67e74705SXin Li     }
50*67e74705SXin Li 
51*67e74705SXin Li     template<typename V>
f1X1::Inner352*67e74705SXin Li     V f1(T t, U u, V) {
53*67e74705SXin Li       return t + u; // expected-error{{cannot initialize return object}}
54*67e74705SXin Li     }
55*67e74705SXin Li   };
56*67e74705SXin Li 
57*67e74705SXin Li   template<typename U>
58*67e74705SXin Li   struct Inner4;
59*67e74705SXin Li };
60*67e74705SXin Li 
61*67e74705SXin Li template<typename T>
62*67e74705SXin Li template<typename U>
63*67e74705SXin Li struct X1<T>::Inner4 {
64*67e74705SXin Li   template<typename V>
65*67e74705SXin Li   V f2(T t, U u, V);
66*67e74705SXin Li 
67*67e74705SXin Li   static U value;
68*67e74705SXin Li };
69*67e74705SXin Li 
70*67e74705SXin Li template<typename T>
71*67e74705SXin Li template<typename U>
72*67e74705SXin Li U X1<T>::Inner4<U>::value; // expected-error{{reference variable}}
73*67e74705SXin Li 
74*67e74705SXin Li template<typename T>
75*67e74705SXin Li template<typename U>
76*67e74705SXin Li template<typename V>
f2(T t,U u,V)77*67e74705SXin Li V X1<T>::Inner4<U>::f2(T t, U u, V) {
78*67e74705SXin Li   return t + u; // expected-error{{cannot initialize return object}}
79*67e74705SXin Li }
80*67e74705SXin Li 
test_X1(int * ip,int i,double * dp)81*67e74705SXin Li void test_X1(int *ip, int i, double *dp) {
82*67e74705SXin Li   X1<void>::Inner0<int> *xvip; // okay
83*67e74705SXin Li   X1<void>::Inner0<int> xvi; // expected-note{{instantiation}}
84*67e74705SXin Li 
85*67e74705SXin Li   X1<int>::Inner1<void> *xivp; // okay
86*67e74705SXin Li   X1<int>::Inner1<void> xiv; // expected-note{{instantiation}}
87*67e74705SXin Li 
88*67e74705SXin Li   X1<int>::Inner2<void>::SuperInner *xisivp; // okay
89*67e74705SXin Li   X1<int>::Inner2<void>::SuperInner xisiv; // expected-note{{instantiation}}
90*67e74705SXin Li 
91*67e74705SXin Li   X1<int*>::Inner3<int> id3;
92*67e74705SXin Li   id3.f0(ip, i);
93*67e74705SXin Li   id3.f0(dp, i); // expected-error{{cannot initialize a parameter of type 'int *' with an lvalue of type 'double *'}}
94*67e74705SXin Li   id3.f1(ip, i, ip);
95*67e74705SXin Li   id3.f1(ip, i, dp); // expected-note{{instantiation}}
96*67e74705SXin Li 
97*67e74705SXin Li   X1<int*>::Inner3<double*> id3b;
98*67e74705SXin Li   id3b.f0(ip, dp); // expected-note{{instantiation}}
99*67e74705SXin Li 
100*67e74705SXin Li   X1<int*>::Inner4<int> id4;
101*67e74705SXin Li   id4.f2(ip, i, dp); // expected-note{{instantiation}}
102*67e74705SXin Li 
103*67e74705SXin Li   X1<int*>::Inner4<int>::value = 17;
104*67e74705SXin Li   i = X1<int*>::Inner4<int&>::value; // expected-note{{instantiation}}
105*67e74705SXin Li }
106*67e74705SXin Li 
107*67e74705SXin Li 
108*67e74705SXin Li template<typename T>
109*67e74705SXin Li struct X2 {
110*67e74705SXin Li   template<T *Ptr> // expected-error{{pointer to a reference}}
111*67e74705SXin Li   struct Inner;
112*67e74705SXin Li 
113*67e74705SXin Li   template<T Value> // expected-error{{cannot have type 'float'}}
114*67e74705SXin Li   struct Inner2;
115*67e74705SXin Li };
116*67e74705SXin Li 
117*67e74705SXin Li X2<int&> x2a; // expected-note{{instantiation}}
118*67e74705SXin Li X2<float> x2b; // expected-note{{instantiation}}
119*67e74705SXin Li 
120*67e74705SXin Li namespace N0 {
121*67e74705SXin Li   template<typename T>
122*67e74705SXin Li   struct X0 { };
123*67e74705SXin Li 
124*67e74705SXin Li   struct X1 {
fN0::X1125*67e74705SXin Li     template<typename T> void f(X0<T>& vals) { g(vals); }
gN0::X1126*67e74705SXin Li     template<typename T> void g(X0<T>& vals) { }
127*67e74705SXin Li   };
128*67e74705SXin Li 
test(X1 x1,X0<int> x0i,X0<long> x0l)129*67e74705SXin Li   void test(X1 x1, X0<int> x0i, X0<long> x0l) {
130*67e74705SXin Li     x1.f(x0i);
131*67e74705SXin Li     x1.f(x0l);
132*67e74705SXin Li   }
133*67e74705SXin Li }
134*67e74705SXin Li 
135*67e74705SXin Li namespace PR6239 {
136*67e74705SXin Li   template <typename T>
137*67e74705SXin Li   struct X0 {
138*67e74705SXin Li     class type {
139*67e74705SXin Li       typedef T E;
140*67e74705SXin Li       template <E e>  // subsitute T for E and bug goes away
141*67e74705SXin Li       struct sfinae {  };
142*67e74705SXin Li 
143*67e74705SXin Li       template <class U>
144*67e74705SXin Li       typename sfinae<&U::operator=>::type test(int);
145*67e74705SXin Li     };
146*67e74705SXin Li   };
147*67e74705SXin Li 
148*67e74705SXin Li   template <typename T>
149*67e74705SXin Li   struct X1 {
150*67e74705SXin Li     typedef T E;
151*67e74705SXin Li     template <E e>  // subsitute T for E and bug goes away
152*67e74705SXin Li     struct sfinae {  };
153*67e74705SXin Li 
154*67e74705SXin Li     template <class U>
155*67e74705SXin Li     typename sfinae<&U::operator=>::type test(int);
156*67e74705SXin Li   };
157*67e74705SXin Li 
158*67e74705SXin Li }
159*67e74705SXin Li 
160*67e74705SXin Li namespace PR7587 {
161*67e74705SXin Li   template<typename> class X0;
162*67e74705SXin Li   template<typename> struct X1;
163*67e74705SXin Li   template<typename> class X2;
164*67e74705SXin Li 
165*67e74705SXin Li   template<typename T> class X3
166*67e74705SXin Li   {
167*67e74705SXin Li     template<
168*67e74705SXin Li       template<typename> class TT,
169*67e74705SXin Li       typename U = typename X1<T>::type
170*67e74705SXin Li     >
171*67e74705SXin Li     struct Inner {
172*67e74705SXin Li       typedef X2<TT<typename X1<T>::type> > Type;
173*67e74705SXin Li     };
174*67e74705SXin Li 
175*67e74705SXin Li     const typename Inner<X0>::Type minCoeff() const;
176*67e74705SXin Li   };
177*67e74705SXin Li 
178*67e74705SXin Li   template<typename T> class X3<T*>
179*67e74705SXin Li   {
180*67e74705SXin Li     template<
181*67e74705SXin Li       template<typename> class TT,
182*67e74705SXin Li       typename U = typename X1<T>::type
183*67e74705SXin Li     >
184*67e74705SXin Li     struct Inner {
185*67e74705SXin Li       typedef X2<TT<typename X1<T>::type> > Type;
186*67e74705SXin Li     };
187*67e74705SXin Li 
188*67e74705SXin Li     const typename Inner<X0>::Type minCoeff() const;
189*67e74705SXin Li   };
190*67e74705SXin Li 
191*67e74705SXin Li }
192*67e74705SXin Li 
193*67e74705SXin Li namespace PR7669 {
194*67e74705SXin Li   template<class> struct X {
195*67e74705SXin Li     template<class> struct Y {
196*67e74705SXin Li       template<int,class> struct Z;
197*67e74705SXin Li       template<int Dummy> struct Z<Dummy,int> {};
198*67e74705SXin Li     };
199*67e74705SXin Li   };
200*67e74705SXin Li 
a()201*67e74705SXin Li   void a()
202*67e74705SXin Li   {
203*67e74705SXin Li     X<int>::Y<int>::Z<0,int>();
204*67e74705SXin Li   }
205*67e74705SXin Li }
206*67e74705SXin Li 
207*67e74705SXin Li namespace PR8489 {
208*67e74705SXin Li   template <typename CT>
209*67e74705SXin Li   class C {
210*67e74705SXin Li     template<typename FT>
F()211*67e74705SXin Li     void F() {} // expected-note{{FT}}
212*67e74705SXin Li   };
f()213*67e74705SXin Li   void f() {
214*67e74705SXin Li     C<int> c;
215*67e74705SXin Li     c.F(); // expected-error{{no matching member function}}
216*67e74705SXin Li   }
217*67e74705SXin Li }
218*67e74705SXin Li 
219*67e74705SXin Li namespace rdar8986308 {
220*67e74705SXin Li   template <bool> struct __static_assert_test;
221*67e74705SXin Li   template <> struct __static_assert_test<true> {};
222*67e74705SXin Li   template <unsigned> struct __static_assert_check {};
223*67e74705SXin Li 
224*67e74705SXin Li   namespace std {
225*67e74705SXin Li 
226*67e74705SXin Li     template <class _Tp, class _Up>
227*67e74705SXin Li     struct __has_rebind
228*67e74705SXin Li     {
229*67e74705SXin Li     private:
230*67e74705SXin Li       struct __two {char _; char __;};
231*67e74705SXin Li       template <class _Xp> static __two __test(...);
232*67e74705SXin Li       template <class _Xp> static char __test(typename _Xp::template rebind<_Up>* = 0);
233*67e74705SXin Li     public:
234*67e74705SXin Li       static const bool value = sizeof(__test<_Tp>(0)) == 1;
235*67e74705SXin Li     };
236*67e74705SXin Li 
237*67e74705SXin Li   }
238*67e74705SXin Li 
239*67e74705SXin Li   template <class T> struct B1 {};
240*67e74705SXin Li 
241*67e74705SXin Li   template <class T>
242*67e74705SXin Li   struct B
243*67e74705SXin Li   {
244*67e74705SXin Li     template <class U> struct rebind {typedef B1<U> other;};
245*67e74705SXin Li   };
246*67e74705SXin Li 
247*67e74705SXin Li   template <class T, class U> struct D1 {};
248*67e74705SXin Li 
249*67e74705SXin Li   template <class T, class U>
250*67e74705SXin Li   struct D
251*67e74705SXin Li   {
252*67e74705SXin Li     template <class V> struct rebind {typedef D1<V, U> other;};
253*67e74705SXin Li   };
254*67e74705SXin Li 
main()255*67e74705SXin Li   int main()
256*67e74705SXin Li   {
257*67e74705SXin Li     typedef __static_assert_check<sizeof(__static_assert_test<((std::__has_rebind<B<int>, double>::value))>)> __t64;
258*67e74705SXin Li     typedef __static_assert_check<sizeof(__static_assert_test<((std::__has_rebind<D<char, int>, double>::value))>)> __t64;
259*67e74705SXin Li   }
260*67e74705SXin Li 
261*67e74705SXin Li }
262