blob: cd74a21d6dbca843a967b59027f680d7f647a200 [file] [log] [blame]
Douglas Gregord94546a2009-05-20 21:38:11 +00001// RUN: clang-cc -fsyntax-only -verify %s
2
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 Gregor3433cf72009-05-21 00:00:09 +000024struct X { // expected-note 2 {{candidate function}}
25 X(int, int); // expected-note 2 {{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
87template<typename T>
88struct Delete0 {
89 void f(T t) {
90 delete t; // expected-error{{cannot delete}}
91 ::delete [] t;
92 }
93};
94
95template struct Delete0<int*>;
96template struct Delete0<X*>;
97template struct Delete0<int>; // expected-note{{instantiation}}
Douglas Gregor42e5b502009-05-21 17:37:52 +000098
99// ---------------------------------------------------------------------
100// throw expressions
101// ---------------------------------------------------------------------
102template<typename T>
103struct Throw1 {
104 void f(T t) {
105 throw;
106 throw t; // expected-error{{incomplete type}}
107 }
108};
109
110struct Incomplete; // expected-note{{forward}}
111
112template struct Throw1<int>;
113template struct Throw1<int*>;
114template struct Throw1<Incomplete*>; // expected-note{{instantiation}}
115
Douglas Gregor12d0c302009-05-21 18:34:44 +0000116// ---------------------------------------------------------------------
117// typeid expressions
118// ---------------------------------------------------------------------
119
120// FIXME: This should really include <typeinfo>, but we don't have that yet.
121namespace std {
122 class type_info;
123}
124
125template<typename T>
126struct TypeId0 {
127 const std::type_info &f(T* ptr) {
128 if (ptr)
129 return typeid(ptr);
130 else
131 return typeid(T);
132 }
133};
134
135struct Abstract {
136 virtual void f() = 0;
137};
138
139template struct TypeId0<int>;
140template struct TypeId0<Incomplete>;
141template struct TypeId0<Abstract>;
Douglas Gregor36bb03b2009-05-21 18:55:48 +0000142
143// ---------------------------------------------------------------------
144// type traits
145// ---------------------------------------------------------------------
146template<typename T>
147struct is_pod {
148 static const bool value = __is_pod(T);
149};
150
151static const int is_pod0[is_pod<X>::value? -1 : 1];
152static const int is_pod1[is_pod<Y>::value? 1 : -1];
Douglas Gregorccb97f52009-05-21 21:38:12 +0000153
154// ---------------------------------------------------------------------
155// initializer lists
156// ---------------------------------------------------------------------
157template<typename T, typename Val1>
158struct InitList1 {
159 void f(Val1 val1) {
160 T x = { val1 };
161 }
162};
163
164struct APair {
165 int *x;
166 const float *y;
167};
168
169template struct InitList1<int[1], float>;
170template struct InitList1<APair, int*>;
171
172template<typename T, typename Val1, typename Val2>
173struct InitList2 {
174 void f(Val1 val1, Val2 val2) {
175 T x = { val1, val2 }; // expected-error{{incompatible}}
176 }
177};
178
179template struct InitList2<APair, int*, float*>;
180template struct InitList2<APair, int*, double*>; // expected-note{{instantiation}}
Douglas Gregor1c0ca592009-05-22 21:13:27 +0000181
182// ---------------------------------------------------------------------
183// member references
184// ---------------------------------------------------------------------
185template<typename T, typename Result>
186struct DotMemRef0 {
187 void f(T t) {
188 Result result = t.m; // expected-error{{cannot be initialized}}
189 }
190};
191
192struct MemInt {
193 int m;
194};
195
196struct InheritsMemInt : MemInt { };
197
198struct MemIntFunc {
199 static int m(int);
200};
201
202template struct DotMemRef0<MemInt, int&>;
203template struct DotMemRef0<InheritsMemInt, int&>;
204template struct DotMemRef0<MemIntFunc, int (*)(int)>;
205template struct DotMemRef0<MemInt, float&>; // expected-note{{instantiation}}
206
207template<typename T, typename Result>
208struct ArrowMemRef0 {
209 void f(T t) {
210 Result result = t->m; // expected-error 2{{cannot be initialized}}
211 }
212};
213
214template<typename T>
215struct ArrowWrapper {
216 T operator->();
217};
218
219template struct ArrowMemRef0<MemInt*, int&>;
220template struct ArrowMemRef0<InheritsMemInt*, int&>;
221template struct ArrowMemRef0<MemIntFunc*, int (*)(int)>;
222template struct ArrowMemRef0<MemInt*, float&>; // expected-note{{instantiation}}
223
224template struct ArrowMemRef0<ArrowWrapper<MemInt*>, int&>;
225template struct ArrowMemRef0<ArrowWrapper<InheritsMemInt*>, int&>;
226template struct ArrowMemRef0<ArrowWrapper<MemIntFunc*>, int (*)(int)>;
227template struct ArrowMemRef0<ArrowWrapper<MemInt*>, float&>; // expected-note{{instantiation}}
228template struct ArrowMemRef0<ArrowWrapper<ArrowWrapper<MemInt*> >, int&>;
229
230// FIXME: we should be able to return a MemInt without the reference!
231MemInt &createMemInt(int);
232
233template<int N>
234struct NonDepMemberExpr0 {
235 void f() {
236 createMemInt(N).m = N;
237 }
238};
239
240template struct NonDepMemberExpr0<0>;
Douglas Gregor08d3e7c2009-05-22 21:26:58 +0000241
242template<typename T, typename Result>
243struct MemberFuncCall0 {
244 void f(T t) {
245 Result result = t.f();
246 }
247};
248
249template<typename T>
250struct HasMemFunc0 {
251 T f();
252};
253
254
255template struct MemberFuncCall0<HasMemFunc0<int&>, const int&>;
256
257template<typename Result>
258struct ThisMemberFuncCall0 {
259 Result g();
260
261 void f() {
262 Result r1 = g();
263 Result r2 = this->g();
264 }
265};
266
267template struct ThisMemberFuncCall0<int&>;
268
269template<typename T>
270struct NonDepMemberCall0 {
271 void foo(HasMemFunc0<int&> x) {
272 T result = x.f(); // expected-error{{initialized}}
273 }
274};
275
276template struct NonDepMemberCall0<int&>;
277template struct NonDepMemberCall0<const int&>;
278template struct NonDepMemberCall0<float&>; // expected-note{{instantiation}}
Douglas Gregore30d0bd2009-05-22 23:47:06 +0000279
280
281template<typename T>
282struct QualifiedDeclRef0 {
283 T f() {
284 return is_pod<X>::value; // expected-error{{initialized}}
285 }
286};
287
288template struct QualifiedDeclRef0<bool>;
289template struct QualifiedDeclRef0<int&>; // expected-note{{instantiation}}