xref: /aosp_15_r20/external/clang/test/SemaTemplate/instantiate-expr-4.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -fcxx-exceptions -fexceptions -fsyntax-only -verify %s
2*67e74705SXin Li // RUN: %clang_cc1 -fcxx-exceptions -fexceptions -fsyntax-only -verify -std=c++98 %s
3*67e74705SXin Li // RUN: %clang_cc1 -fcxx-exceptions -fexceptions -fsyntax-only -verify -std=c++11 %s
4*67e74705SXin Li 
5*67e74705SXin Li // ---------------------------------------------------------------------
6*67e74705SXin Li // C++ Functional Casts
7*67e74705SXin Li // ---------------------------------------------------------------------
8*67e74705SXin Li template<int N>
9*67e74705SXin Li struct ValueInit0 {
fValueInit010*67e74705SXin Li   int f() {
11*67e74705SXin Li     return int();
12*67e74705SXin Li   }
13*67e74705SXin Li };
14*67e74705SXin Li 
15*67e74705SXin Li template struct ValueInit0<5>;
16*67e74705SXin Li 
17*67e74705SXin Li template<int N>
18*67e74705SXin Li struct FunctionalCast0 {
fFunctionalCast019*67e74705SXin Li   int f() {
20*67e74705SXin Li     return int(N);
21*67e74705SXin Li   }
22*67e74705SXin Li };
23*67e74705SXin Li 
24*67e74705SXin Li template struct FunctionalCast0<5>;
25*67e74705SXin Li 
26*67e74705SXin Li struct X { // expected-note 3 {{candidate constructor (the implicit copy constructor)}}
27*67e74705SXin Li #if __cplusplus >= 201103L
28*67e74705SXin Li // expected-note@-2 3 {{candidate constructor (the implicit move constructor) not viable}}
29*67e74705SXin Li #endif
30*67e74705SXin Li   X(int, int); // expected-note 3 {{candidate constructor}}
31*67e74705SXin Li };
32*67e74705SXin Li 
33*67e74705SXin Li template<int N, int M>
34*67e74705SXin Li struct BuildTemporary0 {
fBuildTemporary035*67e74705SXin Li   X f() {
36*67e74705SXin Li     return X(N, M);
37*67e74705SXin Li   }
38*67e74705SXin Li };
39*67e74705SXin Li 
40*67e74705SXin Li template struct BuildTemporary0<5, 7>;
41*67e74705SXin Li 
42*67e74705SXin Li template<int N, int M>
43*67e74705SXin Li struct Temporaries0 {
fTemporaries044*67e74705SXin Li   void f() {
45*67e74705SXin Li     (void)X(N, M);
46*67e74705SXin Li   }
47*67e74705SXin Li };
48*67e74705SXin Li 
49*67e74705SXin Li template struct Temporaries0<5, 7>;
50*67e74705SXin Li 
51*67e74705SXin Li // Ensure that both the constructor and the destructor are instantiated by
52*67e74705SXin Li // checking for parse errors from each.
53*67e74705SXin Li template<int N> struct BadX {
BadXBadX54*67e74705SXin Li   BadX() { int a[-N]; } // expected-error {{array with a negative size}}
~BadXBadX55*67e74705SXin Li   ~BadX() { int a[-N]; } // expected-error {{array with a negative size}}
56*67e74705SXin Li };
57*67e74705SXin Li 
58*67e74705SXin Li template<int N>
59*67e74705SXin Li struct PR6671 {
fPR667160*67e74705SXin Li   void f() { (void)BadX<1>(); } // expected-note 2 {{instantiation}}
61*67e74705SXin Li };
62*67e74705SXin Li template struct PR6671<1>;
63*67e74705SXin Li 
64*67e74705SXin Li // ---------------------------------------------------------------------
65*67e74705SXin Li // new/delete expressions
66*67e74705SXin Li // ---------------------------------------------------------------------
67*67e74705SXin Li struct Y { };
68*67e74705SXin Li 
69*67e74705SXin Li template<typename T>
70*67e74705SXin Li struct New0 {
fNew071*67e74705SXin Li   T* f(bool x) {
72*67e74705SXin Li     if (x)
73*67e74705SXin Li       return new T; // expected-error{{no matching}}
74*67e74705SXin Li     else
75*67e74705SXin Li       return new T();
76*67e74705SXin Li   }
77*67e74705SXin Li };
78*67e74705SXin Li 
79*67e74705SXin Li template struct New0<int>;
80*67e74705SXin Li template struct New0<Y>;
81*67e74705SXin Li template struct New0<X>; // expected-note{{instantiation}}
82*67e74705SXin Li 
83*67e74705SXin Li template<typename T, typename Arg1>
84*67e74705SXin Li struct New1 {
fNew185*67e74705SXin Li   T* f(bool x, Arg1 a1) {
86*67e74705SXin Li     return new T(a1); // expected-error{{no matching}}
87*67e74705SXin Li   }
88*67e74705SXin Li };
89*67e74705SXin Li 
90*67e74705SXin Li template struct New1<int, float>;
91*67e74705SXin Li template struct New1<Y, Y>;
92*67e74705SXin Li template struct New1<X, Y>; // expected-note{{instantiation}}
93*67e74705SXin Li 
94*67e74705SXin Li template<typename T, typename Arg1, typename Arg2>
95*67e74705SXin Li struct New2 {
fNew296*67e74705SXin Li   T* f(bool x, Arg1 a1, Arg2 a2) {
97*67e74705SXin Li     return new T(a1, a2); // expected-error{{no matching}}
98*67e74705SXin Li   }
99*67e74705SXin Li };
100*67e74705SXin Li 
101*67e74705SXin Li template struct New2<X, int, float>;
102*67e74705SXin Li template struct New2<X, int, int*>; // expected-note{{instantiation}}
103*67e74705SXin Li // FIXME: template struct New2<int, int, float>;
104*67e74705SXin Li 
105*67e74705SXin Li // PR5833
106*67e74705SXin Li struct New3 {
107*67e74705SXin Li   New3();
108*67e74705SXin Li 
109*67e74705SXin Li   void *operator new[](__SIZE_TYPE__) __attribute__((unavailable)); // expected-note{{explicitly made unavailable}}
110*67e74705SXin Li };
111*67e74705SXin Li 
112*67e74705SXin Li template<class C>
object_creator()113*67e74705SXin Li void* object_creator() {
114*67e74705SXin Li   return new C(); // expected-error{{call to unavailable function 'operator new[]'}}
115*67e74705SXin Li }
116*67e74705SXin Li 
117*67e74705SXin Li template void *object_creator<New3[4]>(); // expected-note{{instantiation}}
118*67e74705SXin Li 
119*67e74705SXin Li template<typename T>
120*67e74705SXin Li struct Delete0 {
fDelete0121*67e74705SXin Li   void f(T t) {
122*67e74705SXin Li     delete t; // expected-error{{cannot delete}}
123*67e74705SXin Li     ::delete [] t; // expected-error{{cannot delete}}
124*67e74705SXin Li   }
125*67e74705SXin Li };
126*67e74705SXin Li 
127*67e74705SXin Li template struct Delete0<int*>;
128*67e74705SXin Li template struct Delete0<X*>;
129*67e74705SXin Li template struct Delete0<int>; // expected-note{{instantiation}}
130*67e74705SXin Li 
131*67e74705SXin Li namespace PR5755 {
132*67e74705SXin Li   template <class T>
Foo()133*67e74705SXin Li   void Foo() {
134*67e74705SXin Li     char* p = 0;
135*67e74705SXin Li     delete[] p;
136*67e74705SXin Li   }
137*67e74705SXin Li 
Test()138*67e74705SXin Li   void Test() {
139*67e74705SXin Li     Foo<int>();
140*67e74705SXin Li   }
141*67e74705SXin Li }
142*67e74705SXin Li 
143*67e74705SXin Li namespace PR10480 {
144*67e74705SXin Li   template<typename T>
145*67e74705SXin Li   struct X {
146*67e74705SXin Li     X();
~XPR10480::X147*67e74705SXin Li     ~X() {
148*67e74705SXin Li       T *ptr = 1; // expected-error{{cannot initialize a variable of type 'int *' with an rvalue of type 'int'}}
149*67e74705SXin Li     }
150*67e74705SXin Li   };
151*67e74705SXin Li 
152*67e74705SXin Li   template<typename T>
f()153*67e74705SXin Li   void f() {
154*67e74705SXin Li     new X<int>[1]; // expected-note{{in instantiation of member function 'PR10480::X<int>::~X' requested here}}
155*67e74705SXin Li   }
156*67e74705SXin Li 
157*67e74705SXin Li   template void f<int>();
158*67e74705SXin Li }
159*67e74705SXin Li 
160*67e74705SXin Li // ---------------------------------------------------------------------
161*67e74705SXin Li // throw expressions
162*67e74705SXin Li // ---------------------------------------------------------------------
163*67e74705SXin Li template<typename T>
164*67e74705SXin Li struct Throw1 {
fThrow1165*67e74705SXin Li   void f(T t) {
166*67e74705SXin Li     throw;
167*67e74705SXin Li     throw t; // expected-error{{incomplete type}}
168*67e74705SXin Li   }
169*67e74705SXin Li };
170*67e74705SXin Li 
171*67e74705SXin Li struct Incomplete; // expected-note 2{{forward}}
172*67e74705SXin Li 
173*67e74705SXin Li template struct Throw1<int>;
174*67e74705SXin Li template struct Throw1<int*>;
175*67e74705SXin Li template struct Throw1<Incomplete*>; // expected-note{{instantiation}}
176*67e74705SXin Li 
177*67e74705SXin Li // ---------------------------------------------------------------------
178*67e74705SXin Li // typeid expressions
179*67e74705SXin Li // ---------------------------------------------------------------------
180*67e74705SXin Li 
181*67e74705SXin Li namespace std {
182*67e74705SXin Li   class type_info;
183*67e74705SXin Li }
184*67e74705SXin Li 
185*67e74705SXin Li template<typename T>
186*67e74705SXin Li struct TypeId0 {
fTypeId0187*67e74705SXin Li   const std::type_info &f(T* ptr) {
188*67e74705SXin Li     if (ptr)
189*67e74705SXin Li       return typeid(ptr);
190*67e74705SXin Li     else
191*67e74705SXin Li       return typeid(T); // expected-error{{'typeid' of incomplete type 'Incomplete'}}
192*67e74705SXin Li   }
193*67e74705SXin Li };
194*67e74705SXin Li 
195*67e74705SXin Li struct Abstract {
196*67e74705SXin Li   virtual void f() = 0;
197*67e74705SXin Li };
198*67e74705SXin Li 
199*67e74705SXin Li template struct TypeId0<int>;
200*67e74705SXin Li template struct TypeId0<Incomplete>; // expected-note{{instantiation of member function}}
201*67e74705SXin Li template struct TypeId0<Abstract>;
202*67e74705SXin Li 
203*67e74705SXin Li // ---------------------------------------------------------------------
204*67e74705SXin Li // type traits
205*67e74705SXin Li // ---------------------------------------------------------------------
206*67e74705SXin Li template<typename T>
207*67e74705SXin Li struct is_pod {
208*67e74705SXin Li   static const bool value = __is_pod(T);
209*67e74705SXin Li };
210*67e74705SXin Li 
211*67e74705SXin Li static int is_pod0[is_pod<X>::value? -1 : 1];
212*67e74705SXin Li static int is_pod1[is_pod<Y>::value? 1 : -1];
213*67e74705SXin Li 
214*67e74705SXin Li // ---------------------------------------------------------------------
215*67e74705SXin Li // initializer lists
216*67e74705SXin Li // ---------------------------------------------------------------------
217*67e74705SXin Li template<typename T, typename Val1>
218*67e74705SXin Li struct InitList1 {
fInitList1219*67e74705SXin Li   void f(Val1 val1) {
220*67e74705SXin Li     T x = { val1 };
221*67e74705SXin Li #if __cplusplus >= 201103L
222*67e74705SXin Li     // expected-error@-2 {{type 'float' cannot be narrowed to 'int' in initializer list}}
223*67e74705SXin Li     // expected-note@-3 {{insert an explicit cast to silence this issue}}
224*67e74705SXin Li #endif
225*67e74705SXin Li   }
226*67e74705SXin Li };
227*67e74705SXin Li 
228*67e74705SXin Li struct APair {
229*67e74705SXin Li   int *x;
230*67e74705SXin Li   const float *y;
231*67e74705SXin Li };
232*67e74705SXin Li 
233*67e74705SXin Li template struct InitList1<int[1], float>;
234*67e74705SXin Li #if __cplusplus >= 201103L
235*67e74705SXin Li // expected-note@-2 {{instantiation of member function}}
236*67e74705SXin Li #endif
237*67e74705SXin Li template struct InitList1<APair, int*>;
238*67e74705SXin Li 
239*67e74705SXin Li template<typename T, typename Val1, typename Val2>
240*67e74705SXin Li struct InitList2 {
fInitList2241*67e74705SXin Li   void f(Val1 val1, Val2 val2) {
242*67e74705SXin Li     T x = { val1, val2 }; // expected-error{{cannot initialize}}
243*67e74705SXin Li   }
244*67e74705SXin Li };
245*67e74705SXin Li 
246*67e74705SXin Li template struct InitList2<APair, int*, float*>;
247*67e74705SXin Li template struct InitList2<APair, int*, double*>; // expected-note{{instantiation}}
248*67e74705SXin Li 
249*67e74705SXin Li // ---------------------------------------------------------------------
250*67e74705SXin Li // member references
251*67e74705SXin Li // ---------------------------------------------------------------------
252*67e74705SXin Li template<typename T, typename Result>
253*67e74705SXin Li struct DotMemRef0 {
fDotMemRef0254*67e74705SXin Li   void f(T t) {
255*67e74705SXin Li     Result result = t.m; // expected-error{{non-const lvalue reference to type}}
256*67e74705SXin Li   }
257*67e74705SXin Li };
258*67e74705SXin Li 
259*67e74705SXin Li struct MemInt {
260*67e74705SXin Li   int m;
261*67e74705SXin Li };
262*67e74705SXin Li 
263*67e74705SXin Li struct InheritsMemInt : MemInt { };
264*67e74705SXin Li 
265*67e74705SXin Li struct MemIntFunc {
266*67e74705SXin Li   static int m(int);
267*67e74705SXin Li };
268*67e74705SXin Li 
269*67e74705SXin Li template struct DotMemRef0<MemInt, int&>;
270*67e74705SXin Li template struct DotMemRef0<InheritsMemInt, int&>;
271*67e74705SXin Li template struct DotMemRef0<MemIntFunc, int (*)(int)>;
272*67e74705SXin Li template struct DotMemRef0<MemInt, float&>; // expected-note{{instantiation}}
273*67e74705SXin Li 
274*67e74705SXin Li template<typename T, typename Result>
275*67e74705SXin Li struct ArrowMemRef0 {
fArrowMemRef0276*67e74705SXin Li   void f(T t) {
277*67e74705SXin Li     Result result = t->m; // expected-error 2{{non-const lvalue reference}}
278*67e74705SXin Li   }
279*67e74705SXin Li };
280*67e74705SXin Li 
281*67e74705SXin Li template<typename T>
282*67e74705SXin Li struct ArrowWrapper {
283*67e74705SXin Li   T operator->();
284*67e74705SXin Li };
285*67e74705SXin Li 
286*67e74705SXin Li template struct ArrowMemRef0<MemInt*, int&>;
287*67e74705SXin Li template struct ArrowMemRef0<InheritsMemInt*, int&>;
288*67e74705SXin Li template struct ArrowMemRef0<MemIntFunc*, int (*)(int)>;
289*67e74705SXin Li template struct ArrowMemRef0<MemInt*, float&>; // expected-note{{instantiation}}
290*67e74705SXin Li 
291*67e74705SXin Li template struct ArrowMemRef0<ArrowWrapper<MemInt*>, int&>;
292*67e74705SXin Li template struct ArrowMemRef0<ArrowWrapper<InheritsMemInt*>, int&>;
293*67e74705SXin Li template struct ArrowMemRef0<ArrowWrapper<MemIntFunc*>, int (*)(int)>;
294*67e74705SXin Li template struct ArrowMemRef0<ArrowWrapper<MemInt*>, float&>; // expected-note{{instantiation}}
295*67e74705SXin Li template struct ArrowMemRef0<ArrowWrapper<ArrowWrapper<MemInt*> >, int&>;
296*67e74705SXin Li 
297*67e74705SXin Li struct UnresolvedMemRefArray {
298*67e74705SXin Li   int f(int);
299*67e74705SXin Li   int f(char);
300*67e74705SXin Li };
301*67e74705SXin Li UnresolvedMemRefArray Arr[10];
UnresolvedMemRefArrayT(U u)302*67e74705SXin Li template<typename U> int UnresolvedMemRefArrayT(U u) {
303*67e74705SXin Li   return Arr->f(u);
304*67e74705SXin Li }
305*67e74705SXin Li template int UnresolvedMemRefArrayT<int>(int);
306*67e74705SXin Li 
307*67e74705SXin Li // FIXME: we should be able to return a MemInt without the reference!
308*67e74705SXin Li MemInt &createMemInt(int);
309*67e74705SXin Li 
310*67e74705SXin Li template<int N>
311*67e74705SXin Li struct NonDepMemberExpr0 {
fNonDepMemberExpr0312*67e74705SXin Li   void f() {
313*67e74705SXin Li     createMemInt(N).m = N;
314*67e74705SXin Li   }
315*67e74705SXin Li };
316*67e74705SXin Li 
317*67e74705SXin Li template struct NonDepMemberExpr0<0>;
318*67e74705SXin Li 
319*67e74705SXin Li template<typename T, typename Result>
320*67e74705SXin Li struct MemberFuncCall0 {
fMemberFuncCall0321*67e74705SXin Li   void f(T t) {
322*67e74705SXin Li     Result result = t.f();
323*67e74705SXin Li   }
324*67e74705SXin Li };
325*67e74705SXin Li 
326*67e74705SXin Li template<typename T>
327*67e74705SXin Li struct HasMemFunc0 {
328*67e74705SXin Li   T f();
329*67e74705SXin Li };
330*67e74705SXin Li 
331*67e74705SXin Li 
332*67e74705SXin Li template struct MemberFuncCall0<HasMemFunc0<int&>, const int&>;
333*67e74705SXin Li 
334*67e74705SXin Li template<typename Result>
335*67e74705SXin Li struct ThisMemberFuncCall0 {
336*67e74705SXin Li   Result g();
337*67e74705SXin Li 
fThisMemberFuncCall0338*67e74705SXin Li   void f() {
339*67e74705SXin Li     Result r1 = g();
340*67e74705SXin Li     Result r2 = this->g();
341*67e74705SXin Li   }
342*67e74705SXin Li };
343*67e74705SXin Li 
344*67e74705SXin Li template struct ThisMemberFuncCall0<int&>;
345*67e74705SXin Li 
346*67e74705SXin Li template<typename T>
347*67e74705SXin Li struct NonDepMemberCall0 {
fooNonDepMemberCall0348*67e74705SXin Li   void foo(HasMemFunc0<int&> x) {
349*67e74705SXin Li     T result = x.f(); // expected-error{{non-const lvalue reference}}
350*67e74705SXin Li   }
351*67e74705SXin Li };
352*67e74705SXin Li 
353*67e74705SXin Li template struct NonDepMemberCall0<int&>;
354*67e74705SXin Li template struct NonDepMemberCall0<const int&>;
355*67e74705SXin Li template struct NonDepMemberCall0<float&>; // expected-note{{instantiation}}
356*67e74705SXin Li 
357*67e74705SXin Li 
358*67e74705SXin Li template<typename T>
359*67e74705SXin Li struct QualifiedDeclRef0 {
fQualifiedDeclRef0360*67e74705SXin Li   T f() {
361*67e74705SXin Li     return is_pod<X>::value; // expected-error{{non-const lvalue reference to type 'int' cannot bind to a value of unrelated type 'const bool'}}
362*67e74705SXin Li   }
363*67e74705SXin Li };
364*67e74705SXin Li 
365*67e74705SXin Li template struct QualifiedDeclRef0<bool>;
366*67e74705SXin Li template struct QualifiedDeclRef0<int&>; // expected-note{{instantiation}}
367