blob: c524e958f8a7747c5447b2cd6993b85775ce38ba [file] [log] [blame]
Daniel Dunbara5728872009-12-15 20:14:24 +00001// RUN: %clang_cc1 -fsyntax-only -verify %s
Douglas Gregord94546a2009-05-20 21:38:11 +00002
3// ---------------------------------------------------------------------
4// C++ Functional Casts
5// ---------------------------------------------------------------------
6template<int N>
7struct ValueInit0 {
8 int f() {
9 return int();
10 }
11};
12
13template struct ValueInit0<5>;
14
15template<int N>
16struct FunctionalCast0 {
17 int f() {
18 return int(N);
19 }
20};
21
22template struct FunctionalCast0<5>;
23
Douglas Gregor99a2e602009-12-16 01:38:02 +000024struct X { // expected-note 3 {{candidate function}}
25 X(int, int); // expected-note 3 {{candidate function}}
Douglas Gregord94546a2009-05-20 21:38:11 +000026};
27
28template<int N, int M>
29struct BuildTemporary0 {
30 X f() {
31 return X(N, M);
32 }
33};
34
35template struct BuildTemporary0<5, 7>;
Douglas Gregore06274d2009-05-20 21:51:01 +000036
37template<int N, int M>
38struct Temporaries0 {
39 void f() {
40 (void)X(N, M);
41 }
42};
43
44template struct Temporaries0<5, 7>;
Douglas Gregor3433cf72009-05-21 00:00:09 +000045
46// ---------------------------------------------------------------------
Douglas Gregord0c02672009-05-21 17:21:12 +000047// new/delete expressions
Douglas Gregor3433cf72009-05-21 00:00:09 +000048// ---------------------------------------------------------------------
49struct Y { };
50
51template<typename T>
52struct New0 {
53 T* f(bool x) {
54 if (x)
55 return new T; // expected-error{{no matching}}
56 else
57 return new T();
58 }
59};
60
61template struct New0<int>;
62template struct New0<Y>;
63template struct New0<X>; // expected-note{{instantiation}}
64
65template<typename T, typename Arg1>
66struct New1 {
67 T* f(bool x, Arg1 a1) {
68 return new T(a1); // expected-error{{no matching}}
69 }
70};
71
72template struct New1<int, float>;
73template struct New1<Y, Y>;
74template struct New1<X, Y>; // expected-note{{instantiation}}
75
76template<typename T, typename Arg1, typename Arg2>
77struct New2 {
78 T* f(bool x, Arg1 a1, Arg2 a2) {
79 return new T(a1, a2); // expected-error{{no matching}}
80 }
81};
82
83template struct New2<X, int, float>;
84template struct New2<X, int, int*>; // expected-note{{instantiation}}
85// FIXME: template struct New2<int, int, float>;
Douglas Gregord0c02672009-05-21 17:21:12 +000086
Douglas Gregor5b5ad842009-12-22 17:13:37 +000087// PR5833
88struct New3 {
89 New3();
90
91 void *operator new[](__SIZE_TYPE__) __attribute__((unavailable)); // expected-note{{explicitly made unavailable}}
92};
93
94template<class C>
95void* object_creator() {
96 return new C(); // expected-error{{call to unavailable function 'operator new[]'}}
97}
98
99template void *object_creator<New3[4]>(); // expected-note{{instantiation}}
100
Douglas Gregord0c02672009-05-21 17:21:12 +0000101template<typename T>
102struct Delete0 {
103 void f(T t) {
104 delete t; // expected-error{{cannot delete}}
105 ::delete [] t;
106 }
107};
108
109template struct Delete0<int*>;
110template struct Delete0<X*>;
111template struct Delete0<int>; // expected-note{{instantiation}}
Douglas Gregor42e5b502009-05-21 17:37:52 +0000112
Douglas Gregora88cfbf2009-12-12 18:16:41 +0000113namespace PR5755 {
114 template <class T>
115 void Foo() {
116 char* p = 0;
117 delete[] p;
118 }
119
120 void Test() {
121 Foo<int>();
122 }
123}
124
Douglas Gregor42e5b502009-05-21 17:37:52 +0000125// ---------------------------------------------------------------------
126// throw expressions
127// ---------------------------------------------------------------------
128template<typename T>
129struct Throw1 {
130 void f(T t) {
131 throw;
132 throw t; // expected-error{{incomplete type}}
133 }
134};
135
Douglas Gregor765ccba2009-12-23 21:06:06 +0000136struct Incomplete; // expected-note 2{{forward}}
Douglas Gregor42e5b502009-05-21 17:37:52 +0000137
138template struct Throw1<int>;
139template struct Throw1<int*>;
140template struct Throw1<Incomplete*>; // expected-note{{instantiation}}
141
Douglas Gregor12d0c302009-05-21 18:34:44 +0000142// ---------------------------------------------------------------------
143// typeid expressions
144// ---------------------------------------------------------------------
145
Douglas Gregor12d0c302009-05-21 18:34:44 +0000146namespace std {
147 class type_info;
148}
149
150template<typename T>
151struct TypeId0 {
152 const std::type_info &f(T* ptr) {
153 if (ptr)
154 return typeid(ptr);
155 else
Douglas Gregor765ccba2009-12-23 21:06:06 +0000156 return typeid(T); // expected-error{{'typeid' of incomplete type 'struct Incomplete'}}
Douglas Gregor12d0c302009-05-21 18:34:44 +0000157 }
158};
159
160struct Abstract {
161 virtual void f() = 0;
162};
163
164template struct TypeId0<int>;
Douglas Gregor765ccba2009-12-23 21:06:06 +0000165template struct TypeId0<Incomplete>; // expected-note{{instantiation of member function}}
Douglas Gregor12d0c302009-05-21 18:34:44 +0000166template struct TypeId0<Abstract>;
Douglas Gregor36bb03b2009-05-21 18:55:48 +0000167
168// ---------------------------------------------------------------------
169// type traits
170// ---------------------------------------------------------------------
171template<typename T>
172struct is_pod {
173 static const bool value = __is_pod(T);
174};
175
176static const int is_pod0[is_pod<X>::value? -1 : 1];
177static const int is_pod1[is_pod<Y>::value? 1 : -1];
Douglas Gregorccb97f52009-05-21 21:38:12 +0000178
179// ---------------------------------------------------------------------
180// initializer lists
181// ---------------------------------------------------------------------
182template<typename T, typename Val1>
183struct InitList1 {
184 void f(Val1 val1) {
185 T x = { val1 };
186 }
187};
188
189struct APair {
190 int *x;
191 const float *y;
192};
193
194template struct InitList1<int[1], float>;
195template struct InitList1<APair, int*>;
196
197template<typename T, typename Val1, typename Val2>
198struct InitList2 {
199 void f(Val1 val1, Val2 val2) {
200 T x = { val1, val2 }; // expected-error{{incompatible}}
201 }
202};
203
204template struct InitList2<APair, int*, float*>;
205template struct InitList2<APair, int*, double*>; // expected-note{{instantiation}}
Douglas Gregor1c0ca592009-05-22 21:13:27 +0000206
207// ---------------------------------------------------------------------
208// member references
209// ---------------------------------------------------------------------
210template<typename T, typename Result>
211struct DotMemRef0 {
212 void f(T t) {
Douglas Gregor20093b42009-12-09 23:02:17 +0000213 Result result = t.m; // expected-error{{non-const lvalue reference to type}}
Douglas Gregor1c0ca592009-05-22 21:13:27 +0000214 }
215};
216
217struct MemInt {
218 int m;
219};
220
221struct InheritsMemInt : MemInt { };
222
223struct MemIntFunc {
224 static int m(int);
225};
226
227template struct DotMemRef0<MemInt, int&>;
228template struct DotMemRef0<InheritsMemInt, int&>;
229template struct DotMemRef0<MemIntFunc, int (*)(int)>;
230template struct DotMemRef0<MemInt, float&>; // expected-note{{instantiation}}
231
232template<typename T, typename Result>
233struct ArrowMemRef0 {
234 void f(T t) {
Douglas Gregor20093b42009-12-09 23:02:17 +0000235 Result result = t->m; // expected-error 2{{non-const lvalue reference}}
Douglas Gregor1c0ca592009-05-22 21:13:27 +0000236 }
237};
238
239template<typename T>
240struct ArrowWrapper {
241 T operator->();
242};
243
244template struct ArrowMemRef0<MemInt*, int&>;
245template struct ArrowMemRef0<InheritsMemInt*, int&>;
246template struct ArrowMemRef0<MemIntFunc*, int (*)(int)>;
247template struct ArrowMemRef0<MemInt*, float&>; // expected-note{{instantiation}}
248
249template struct ArrowMemRef0<ArrowWrapper<MemInt*>, int&>;
250template struct ArrowMemRef0<ArrowWrapper<InheritsMemInt*>, int&>;
251template struct ArrowMemRef0<ArrowWrapper<MemIntFunc*>, int (*)(int)>;
252template struct ArrowMemRef0<ArrowWrapper<MemInt*>, float&>; // expected-note{{instantiation}}
253template struct ArrowMemRef0<ArrowWrapper<ArrowWrapper<MemInt*> >, int&>;
254
255// FIXME: we should be able to return a MemInt without the reference!
256MemInt &createMemInt(int);
257
258template<int N>
259struct NonDepMemberExpr0 {
260 void f() {
261 createMemInt(N).m = N;
262 }
263};
264
265template struct NonDepMemberExpr0<0>;
Douglas Gregor08d3e7c2009-05-22 21:26:58 +0000266
267template<typename T, typename Result>
268struct MemberFuncCall0 {
269 void f(T t) {
270 Result result = t.f();
271 }
272};
273
274template<typename T>
275struct HasMemFunc0 {
276 T f();
277};
278
279
280template struct MemberFuncCall0<HasMemFunc0<int&>, const int&>;
281
282template<typename Result>
283struct ThisMemberFuncCall0 {
284 Result g();
285
286 void f() {
287 Result r1 = g();
288 Result r2 = this->g();
289 }
290};
291
292template struct ThisMemberFuncCall0<int&>;
293
294template<typename T>
295struct NonDepMemberCall0 {
296 void foo(HasMemFunc0<int&> x) {
Douglas Gregor20093b42009-12-09 23:02:17 +0000297 T result = x.f(); // expected-error{{non-const lvalue reference}}
Douglas Gregor08d3e7c2009-05-22 21:26:58 +0000298 }
299};
300
301template struct NonDepMemberCall0<int&>;
302template struct NonDepMemberCall0<const int&>;
303template struct NonDepMemberCall0<float&>; // expected-note{{instantiation}}
Douglas Gregore30d0bd2009-05-22 23:47:06 +0000304
305
306template<typename T>
307struct QualifiedDeclRef0 {
308 T f() {
Douglas Gregor18ef5e22009-12-18 05:02:21 +0000309 return is_pod<X>::value; // expected-error{{non-const lvalue reference to type 'int' cannot bind to a value of unrelated type 'bool const'}}
Douglas Gregore30d0bd2009-05-22 23:47:06 +0000310 }
311};
312
313template struct QualifiedDeclRef0<bool>;
314template struct QualifiedDeclRef0<int&>; // expected-note{{instantiation}}