xref: /aosp_15_r20/external/clang/test/SemaTemplate/instantiate-function-1.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -fcxx-exceptions -fexceptions -fsyntax-only -verify %s
2*67e74705SXin Li template<typename T, typename U>
3*67e74705SXin Li struct X0 {
fX04*67e74705SXin Li   void f(T x, U y) {
5*67e74705SXin Li     (void)(x + y); // expected-error{{invalid operands}}
6*67e74705SXin Li   }
7*67e74705SXin Li };
8*67e74705SXin Li 
9*67e74705SXin Li struct X1 { };
10*67e74705SXin Li 
11*67e74705SXin Li template struct X0<int, float>;
12*67e74705SXin Li template struct X0<int*, int>;
13*67e74705SXin Li template struct X0<int X1::*, int>; // expected-note{{instantiation of}}
14*67e74705SXin Li 
15*67e74705SXin Li template<typename T>
16*67e74705SXin Li struct X2 {
17*67e74705SXin Li   void f(T);
18*67e74705SXin Li 
gX219*67e74705SXin Li   T g(T x, T y) {
20*67e74705SXin Li     /* DeclStmt */;
21*67e74705SXin Li     T *xp = &x, &yr = y; // expected-error{{pointer to a reference}}
22*67e74705SXin Li     /* NullStmt */;
23*67e74705SXin Li   }
24*67e74705SXin Li };
25*67e74705SXin Li 
26*67e74705SXin Li template struct X2<int>;
27*67e74705SXin Li template struct X2<int&>; // expected-note{{instantiation of}}
28*67e74705SXin Li 
29*67e74705SXin Li template<typename T>
30*67e74705SXin Li struct X3 {
fX331*67e74705SXin Li   void f(T) {
32*67e74705SXin Li     Label:
33*67e74705SXin Li     T x;
34*67e74705SXin Li     goto Label;
35*67e74705SXin Li   }
36*67e74705SXin Li };
37*67e74705SXin Li 
38*67e74705SXin Li template struct X3<int>;
39*67e74705SXin Li 
40*67e74705SXin Li template <typename T> struct X4 {
fX441*67e74705SXin Li   T f() const {
42*67e74705SXin Li     return; // expected-error{{non-void function 'f' should return a value}}
43*67e74705SXin Li   }
44*67e74705SXin Li 
gX445*67e74705SXin Li   T g() const {
46*67e74705SXin Li     return 1; // expected-error{{void function 'g' should not return a value}}
47*67e74705SXin Li   }
48*67e74705SXin Li };
49*67e74705SXin Li 
50*67e74705SXin Li template struct X4<void>; // expected-note{{in instantiation of}}
51*67e74705SXin Li template struct X4<int>; // expected-note{{in instantiation of}}
52*67e74705SXin Li 
53*67e74705SXin Li struct Incomplete; // expected-note 2{{forward declaration}}
54*67e74705SXin Li 
55*67e74705SXin Li template<typename T> struct X5 {
fX556*67e74705SXin Li   T f() { } // expected-error{{incomplete result type}}
57*67e74705SXin Li };
58*67e74705SXin Li void test_X5(X5<Incomplete> x5); // okay!
59*67e74705SXin Li 
60*67e74705SXin Li template struct X5<Incomplete>; // expected-note{{instantiation}}
61*67e74705SXin Li 
62*67e74705SXin Li template<typename T, typename U, typename V> struct X6 {
fX663*67e74705SXin Li   U f(T t, U u, V v) {
64*67e74705SXin Li     // IfStmt
65*67e74705SXin Li     if (t > 0)
66*67e74705SXin Li       return u;
67*67e74705SXin Li     else {
68*67e74705SXin Li       if (t < 0)
69*67e74705SXin Li         return v; // expected-error{{cannot initialize return object of type}}
70*67e74705SXin Li     }
71*67e74705SXin Li 
72*67e74705SXin Li     if (T x = t) {
73*67e74705SXin Li       t = x;
74*67e74705SXin Li     }
75*67e74705SXin Li     return v; // expected-error{{cannot initialize return object of type}}
76*67e74705SXin Li   }
77*67e74705SXin Li };
78*67e74705SXin Li 
79*67e74705SXin Li struct ConvertibleToInt {
80*67e74705SXin Li   operator int() const;
81*67e74705SXin Li };
82*67e74705SXin Li 
83*67e74705SXin Li template struct X6<ConvertibleToInt, float, char>;
84*67e74705SXin Li template struct X6<bool, int, int*>; // expected-note{{instantiation}}
85*67e74705SXin Li 
86*67e74705SXin Li template <typename T> struct X7 {
fX787*67e74705SXin Li   void f() {
88*67e74705SXin Li     void *v = this;
89*67e74705SXin Li   }
90*67e74705SXin Li };
91*67e74705SXin Li 
92*67e74705SXin Li template struct X7<int>;
93*67e74705SXin Li 
94*67e74705SXin Li template<typename T> struct While0 {
fWhile095*67e74705SXin Li   void f(T t) {
96*67e74705SXin Li     while (t) {
97*67e74705SXin Li     }
98*67e74705SXin Li 
99*67e74705SXin Li     while (T t2 = T()) ;
100*67e74705SXin Li   }
101*67e74705SXin Li };
102*67e74705SXin Li 
103*67e74705SXin Li template struct While0<float>;
104*67e74705SXin Li 
105*67e74705SXin Li template<typename T> struct Do0 {
fDo0106*67e74705SXin Li   void f(T t) {
107*67e74705SXin Li     do {
108*67e74705SXin Li     } while (t); // expected-error{{not contextually}}
109*67e74705SXin Li   }
110*67e74705SXin Li };
111*67e74705SXin Li 
112*67e74705SXin Li struct NotConvertibleToBool { };
113*67e74705SXin Li template struct Do0<ConvertibleToInt>;
114*67e74705SXin Li template struct Do0<NotConvertibleToBool>; // expected-note{{instantiation}}
115*67e74705SXin Li 
116*67e74705SXin Li template<typename T> struct For0 {
fFor0117*67e74705SXin Li   void f(T f, T l) {
118*67e74705SXin Li     for (; f != l; ++f) {
119*67e74705SXin Li       if (*f)
120*67e74705SXin Li         continue;
121*67e74705SXin Li       else if (*f == 17)
122*67e74705SXin Li         break;
123*67e74705SXin Li     }
124*67e74705SXin Li   }
125*67e74705SXin Li };
126*67e74705SXin Li 
127*67e74705SXin Li template struct For0<int*>;
128*67e74705SXin Li 
129*67e74705SXin Li template<typename T> struct Member0 {
fMember0130*67e74705SXin Li   void f(T t) {
131*67e74705SXin Li     t;
132*67e74705SXin Li     t.f;
133*67e74705SXin Li     t->f;
134*67e74705SXin Li 
135*67e74705SXin Li     T* tp;
136*67e74705SXin Li     tp.f; // expected-error{{member reference base type 'T *' is not a structure or union}}
137*67e74705SXin Li     tp->f;
138*67e74705SXin Li 
139*67e74705SXin Li     this->f;
140*67e74705SXin Li     this.f; // expected-error{{member reference base type 'Member0<T> *' is not a structure or union}}
141*67e74705SXin Li   }
142*67e74705SXin Li };
143*67e74705SXin Li 
144*67e74705SXin Li template<typename T, typename U> struct Switch0 {
fSwitch0145*67e74705SXin Li   U f(T value, U v0, U v1, U v2) {
146*67e74705SXin Li     switch (value) {
147*67e74705SXin Li     case 0: return v0;
148*67e74705SXin Li 
149*67e74705SXin Li     case 1: return v1;
150*67e74705SXin Li 
151*67e74705SXin Li     case 2: // fall through
152*67e74705SXin Li 
153*67e74705SXin Li     default:
154*67e74705SXin Li       return  v2;
155*67e74705SXin Li     }
156*67e74705SXin Li   }
157*67e74705SXin Li };
158*67e74705SXin Li 
159*67e74705SXin Li template struct Switch0<int, float>;
160*67e74705SXin Li 
161*67e74705SXin Li template<typename T, int I1, int I2> struct Switch1 {
fSwitch1162*67e74705SXin Li   T f(T x, T y, T z) {
163*67e74705SXin Li     switch (x) {
164*67e74705SXin Li     case I1: return y; // expected-note{{previous}}
165*67e74705SXin Li     case I2: return z; // expected-error{{duplicate}}
166*67e74705SXin Li     default: return x;
167*67e74705SXin Li     }
168*67e74705SXin Li   }
169*67e74705SXin Li };
170*67e74705SXin Li 
171*67e74705SXin Li template struct Switch1<int, 1, 2>;
172*67e74705SXin Li template struct Switch1<int, 2, 2>; // expected-note{{instantiation}}
173*67e74705SXin Li 
174*67e74705SXin Li template<typename T> struct IndirectGoto0 {
fIndirectGoto0175*67e74705SXin Li   void f(T x) {
176*67e74705SXin Li     // FIXME: crummy error message below
177*67e74705SXin Li     goto *x; // expected-error{{incompatible}}
178*67e74705SXin Li 
179*67e74705SXin Li   prior:
180*67e74705SXin Li     T prior_label;
181*67e74705SXin Li     prior_label = &&prior; // expected-error{{assigning to 'int'}}
182*67e74705SXin Li 
183*67e74705SXin Li     T later_label;
184*67e74705SXin Li     later_label = &&later; // expected-error{{assigning to 'int'}}
185*67e74705SXin Li 
186*67e74705SXin Li   later:
187*67e74705SXin Li     (void)(1+1);
188*67e74705SXin Li   }
189*67e74705SXin Li };
190*67e74705SXin Li 
191*67e74705SXin Li template struct IndirectGoto0<void*>;
192*67e74705SXin Li template struct IndirectGoto0<int>; // expected-note{{instantiation}}
193*67e74705SXin Li 
194*67e74705SXin Li template<typename T> struct TryCatch0 {
fTryCatch0195*67e74705SXin Li   void f() {
196*67e74705SXin Li     try {
197*67e74705SXin Li     } catch (T t) { // expected-error{{incomplete type}} \
198*67e74705SXin Li                     // expected-error{{abstract class}}
199*67e74705SXin Li     } catch (...) {
200*67e74705SXin Li     }
201*67e74705SXin Li   }
202*67e74705SXin Li };
203*67e74705SXin Li 
204*67e74705SXin Li struct Abstract {
205*67e74705SXin Li   virtual void foo() = 0; // expected-note{{pure virtual}}
206*67e74705SXin Li };
207*67e74705SXin Li 
208*67e74705SXin Li template struct TryCatch0<int>; // okay
209*67e74705SXin Li template struct TryCatch0<Incomplete*>; // expected-note{{instantiation}}
210*67e74705SXin Li template struct TryCatch0<Abstract>; // expected-note{{instantiation}}
211*67e74705SXin Li 
212*67e74705SXin Li // PR4383
213*67e74705SXin Li template<typename T> struct X;
214*67e74705SXin Li template<typename T> struct Y : public X<T> {
xY215*67e74705SXin Li   Y& x() { return *this; }
216*67e74705SXin Li };
217*67e74705SXin Li 
218*67e74705SXin Li // Make sure our assertions don't get too uppity.
219*67e74705SXin Li namespace test0 {
220*67e74705SXin Li   template <class T> class A { void foo(T array[10]); };
221*67e74705SXin Li   template class A<int>;
222*67e74705SXin Li }
223*67e74705SXin Li 
224*67e74705SXin Li namespace PR7016 {
f()225*67e74705SXin Li   template<typename T> void f() { T x = x; }
226*67e74705SXin Li   template void f<int>();
227*67e74705SXin Li }
228*67e74705SXin Li 
229*67e74705SXin Li namespace PR9880 {
230*67e74705SXin Li   struct lua_State;
231*67e74705SXin Li   struct no_tag { char a; };			// (A)
232*67e74705SXin Li   struct yes_tag { long a; long b; };	// (A)
233*67e74705SXin Li 
234*67e74705SXin Li   template <typename T>
235*67e74705SXin Li   struct HasIndexMetamethod {
236*67e74705SXin Li     template <typename U>
237*67e74705SXin Li     static no_tag check(...);
238*67e74705SXin Li     template <typename U>
239*67e74705SXin Li     static yes_tag check(char[sizeof(&U::luaIndex)]);
240*67e74705SXin Li     enum { value = sizeof(check<T>(0)) == sizeof(yes_tag) };
241*67e74705SXin Li   };
242*67e74705SXin Li 
243*67e74705SXin Li   class SomeClass {
244*67e74705SXin Li   public:
245*67e74705SXin Li     int luaIndex(lua_State* L);
246*67e74705SXin Li   };
247*67e74705SXin Li 
248*67e74705SXin Li   int i = HasIndexMetamethod<SomeClass>::value;
249*67e74705SXin Li }
250