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