150
|
1 // RUN: %clang_cc1 -verify -std=c++11 %s
|
|
2 // RUN: %clang_cc1 -verify -std=c++11 -fdelayed-template-parsing %s
|
|
3
|
|
4 template<typename T>
|
|
5 void f0() {
|
|
6 struct X;
|
|
7 typedef struct Y {
|
|
8 T (X::* f1())(int) { return 0; }
|
|
9 } Y2;
|
|
10
|
|
11 Y2 y = Y();
|
|
12 }
|
|
13
|
|
14 template void f0<int>();
|
|
15
|
|
16 // PR5764
|
|
17 namespace PR5764 {
|
|
18 struct X {
|
|
19 template <typename T>
|
|
20 void Bar() {
|
|
21 typedef T ValueType;
|
|
22 struct Y {
|
|
23 Y() { V = ValueType(); }
|
|
24
|
|
25 ValueType V;
|
|
26 };
|
|
27
|
|
28 Y y;
|
|
29 }
|
|
30 };
|
|
31
|
|
32 void test(X x) {
|
|
33 x.Bar<int>();
|
|
34 }
|
|
35 }
|
|
36
|
|
37 // Instantiation of local classes with virtual functions.
|
|
38 namespace local_class_with_virtual_functions {
|
|
39 template <typename T> struct X { };
|
|
40 template <typename T> struct Y { };
|
|
41
|
|
42 template <typename T>
|
|
43 void f() {
|
|
44 struct Z : public X<Y<T>*> {
|
|
45 virtual void g(Y<T>* y) { }
|
|
46 void g2(int x) {(void)x;}
|
|
47 };
|
|
48 Z z;
|
|
49 (void)z;
|
|
50 }
|
|
51
|
|
52 struct S { };
|
|
53 void test() { f<S>(); }
|
|
54 }
|
|
55
|
|
56 namespace PR8801 {
|
|
57 template<typename T>
|
|
58 void foo() {
|
|
59 class X;
|
|
60 typedef int (X::*pmf_type)();
|
|
61 class X : public T { };
|
|
62
|
|
63 pmf_type pmf = &T::foo;
|
|
64 }
|
|
65
|
|
66 struct Y { int foo(); };
|
|
67
|
|
68 template void foo<Y>();
|
|
69 }
|
|
70
|
|
71 namespace TemplatePacksAndLambdas {
|
|
72 template <typename ...T> int g(T...);
|
|
73 struct S {
|
|
74 template <typename ...T> static void f(int f = g([]{ static T t; return ++t; }()...)) {}
|
|
75 };
|
|
76 void h() { S::f<int, int, int>(); }
|
|
77 }
|
|
78
|
|
79 namespace PR9685 {
|
|
80 template <class Thing> void forEach(Thing t) { t.func(); }
|
|
81
|
|
82 template <typename T> void doIt() {
|
|
83 struct Functor {
|
|
84 void func() { (void)i; }
|
|
85 int i;
|
|
86 };
|
|
87
|
|
88 forEach(Functor());
|
|
89 }
|
|
90
|
|
91 void call() {
|
|
92 doIt<int>();
|
|
93 }
|
|
94 }
|
|
95
|
|
96 namespace PR12702 {
|
|
97 struct S {
|
|
98 template <typename F> bool apply(F f) { return f(); }
|
|
99 };
|
|
100
|
|
101 template <typename> struct T {
|
|
102 void foo() {
|
|
103 struct F {
|
|
104 int x;
|
|
105
|
|
106 bool operator()() { return x == 0; }
|
|
107 };
|
|
108
|
|
109 S().apply(F());
|
|
110 }
|
|
111 };
|
|
112
|
|
113 void call() { T<int>().foo(); }
|
|
114 }
|
|
115
|
|
116 namespace PR17139 {
|
|
117 template <class T> void foo(const T &t) { t.foo(); }
|
|
118
|
|
119 template <class F> void bar(F *f) {
|
|
120 struct B {
|
|
121 F *fn;
|
|
122 void foo() const { fn(); }
|
|
123 } b = { f };
|
|
124 foo(b);
|
|
125 }
|
|
126
|
|
127 void go() {}
|
|
128
|
|
129 void test() { bar(go); }
|
|
130 }
|
|
131
|
|
132 namespace PR17740 {
|
|
133 class C {
|
|
134 public:
|
|
135 template <typename T> static void foo(T function);
|
|
136 template <typename T> static void bar(T function);
|
|
137 template <typename T> static void func(T function);
|
|
138 };
|
|
139
|
|
140 template <typename T> void C::foo(T function) { function(); }
|
|
141
|
|
142 template <typename T> void C::bar(T function) {
|
|
143 foo([&function]() { function(); });
|
|
144 }
|
|
145
|
|
146 template <typename T> void C::func(T function) {
|
|
147 struct Struct {
|
|
148 T mFunction;
|
|
149
|
|
150 Struct(T function) : mFunction(function) {};
|
|
151
|
|
152 void operator()() {
|
|
153 mFunction();
|
|
154 };
|
|
155 };
|
|
156
|
|
157 bar(Struct(function));
|
|
158 }
|
|
159
|
|
160 void call() {
|
|
161 C::func([]() {});
|
|
162 }
|
|
163 }
|
|
164
|
|
165 namespace PR14373 {
|
|
166 struct function {
|
|
167 template <typename _Functor> function(_Functor __f) { __f(); }
|
|
168 };
|
|
169 template <typename Func> function exec_func(Func f) {
|
|
170 struct functor {
|
|
171 functor(Func f) : func(f) {}
|
|
172 void operator()() const { func(); }
|
|
173 Func func;
|
|
174 };
|
|
175 return functor(f);
|
|
176 }
|
|
177 struct Type {
|
|
178 void operator()() const {}
|
|
179 };
|
|
180 int call() {
|
|
181 exec_func(Type());
|
|
182 return 0;
|
|
183 }
|
|
184 }
|
|
185
|
|
186 namespace PR18907 {
|
|
187 template <typename>
|
|
188 class C : public C<int> {}; // expected-error{{within its own definition}}
|
|
189
|
|
190 template <typename X>
|
|
191 void F() {
|
|
192 struct A : C<X> {};
|
|
193 }
|
|
194
|
|
195 struct B {
|
|
196 void f() { F<int>(); }
|
|
197 };
|
|
198 }
|
|
199
|
|
200 namespace PR23194 {
|
|
201 struct X {
|
|
202 int operator()() const { return 0; }
|
|
203 };
|
|
204 struct Y {
|
|
205 Y(int) {}
|
|
206 };
|
|
207 template <bool = true> int make_seed_pair() noexcept {
|
|
208 struct state_t {
|
|
209 X x;
|
|
210 Y y{x()};
|
|
211 };
|
|
212 return 0;
|
|
213 }
|
|
214 int func() {
|
|
215 return make_seed_pair();
|
|
216 }
|
|
217 }
|
|
218
|
|
219 namespace PR18653 {
|
|
220 // Forward declarations
|
|
221
|
|
222 template<typename T> void f1() {
|
|
223 void g1(struct x1);
|
|
224 struct x1 {};
|
|
225 }
|
|
226 template void f1<int>();
|
|
227
|
|
228 template<typename T> void f1a() {
|
|
229 void g1(union x1);
|
|
230 union x1 {};
|
|
231 }
|
|
232 template void f1a<int>();
|
|
233
|
|
234 template<typename T> void f2() {
|
|
235 void g2(enum x2); // expected-error{{ISO C++ forbids forward references to 'enum' types}}
|
|
236 enum x2 { nothing };
|
|
237 }
|
|
238 template void f2<int>();
|
|
239
|
|
240 template<typename T> void f3() {
|
|
241 void g3(enum class x3);
|
|
242 enum class x3 { nothing };
|
|
243 }
|
|
244 template void f3<int>();
|
|
245
|
|
246
|
|
247 template<typename T> void f4() {
|
|
248 void g4(struct x4 {} x); // expected-error{{'x4' cannot be defined in a parameter type}}
|
|
249 }
|
|
250 template void f4<int>();
|
|
251
|
|
252 template<typename T> void f4a() {
|
|
253 void g4(union x4 {} x); // expected-error{{'x4' cannot be defined in a parameter type}}
|
|
254 }
|
|
255 template void f4a<int>();
|
|
256
|
|
257
|
|
258 template <class T> void f();
|
|
259 template <class T> struct S1 {
|
|
260 void m() {
|
|
261 f<class newclass>();
|
|
262 f<union newunion>();
|
|
263 }
|
|
264 };
|
|
265 template struct S1<int>;
|
|
266
|
|
267 template <class T> struct S2 {
|
|
268 void m() {
|
|
269 f<enum new_enum>(); // expected-error{{ISO C++ forbids forward references to 'enum' types}}
|
|
270 }
|
|
271 };
|
|
272 template struct S2<int>;
|
|
273
|
|
274 template <class T> struct S3 {
|
|
275 void m() {
|
|
276 f<enum class new_enum>();
|
|
277 }
|
|
278 };
|
|
279 template struct S3<int>;
|
|
280
|
|
281 template <class T> struct S4 {
|
|
282 struct local {};
|
|
283 void m() {
|
|
284 f<local>();
|
|
285 }
|
|
286 };
|
|
287 template struct S4<int>;
|
|
288
|
|
289 template <class T> struct S4a {
|
|
290 union local {};
|
|
291 void m() {
|
|
292 f<local>();
|
|
293 }
|
|
294 };
|
|
295 template struct S4a<int>;
|
|
296
|
|
297 template <class T> struct S5 {
|
|
298 enum local { nothing };
|
|
299 void m() {
|
|
300 f<local>();
|
|
301 }
|
|
302 };
|
|
303 template struct S5<int>;
|
|
304
|
|
305 template <class T> struct S7 {
|
|
306 enum class local { nothing };
|
|
307 void m() {
|
|
308 f<local>();
|
|
309 }
|
|
310 };
|
|
311 template struct S7<int>;
|
|
312
|
|
313
|
|
314 template <class T> void fff(T *x);
|
|
315 template <class T> struct S01 {
|
|
316 struct local { };
|
|
317 void m() {
|
|
318 local x;
|
|
319 fff(&x);
|
|
320 }
|
|
321 };
|
|
322 template struct S01<int>;
|
|
323
|
|
324 template <class T> struct S01a {
|
|
325 union local { };
|
|
326 void m() {
|
|
327 local x;
|
|
328 fff(&x);
|
|
329 }
|
|
330 };
|
|
331 template struct S01a<int>;
|
|
332
|
|
333 template <class T> struct S02 {
|
|
334 enum local { nothing };
|
|
335 void m() {
|
|
336 local x;
|
|
337 fff(&x);
|
|
338 }
|
|
339 };
|
|
340 template struct S02<int>;
|
|
341
|
|
342 template <class T> struct S03 {
|
|
343 enum class local { nothing };
|
|
344 void m() {
|
|
345 local x;
|
|
346 fff(&x);
|
|
347 }
|
|
348 };
|
|
349 template struct S03<int>;
|
|
350
|
|
351
|
|
352 template <class T> struct S04 {
|
|
353 void m() {
|
|
354 struct { } x;
|
|
355 fff(&x);
|
|
356 }
|
|
357 };
|
|
358 template struct S04<int>;
|
|
359
|
|
360 template <class T> struct S04a {
|
|
361 void m() {
|
|
362 union { } x;
|
|
363 fff(&x);
|
|
364 }
|
|
365 };
|
|
366 template struct S04a<int>;
|
|
367
|
|
368 template <class T> struct S05 {
|
|
369 void m() {
|
|
370 enum { nothing } x;
|
|
371 fff(&x);
|
|
372 }
|
|
373 };
|
|
374 template struct S05<int>;
|
|
375
|
|
376 template <class T> struct S06 {
|
|
377 void m() {
|
|
378 class { virtual void mmm() {} } x;
|
|
379 fff(&x);
|
|
380 }
|
|
381 };
|
|
382 template struct S06<int>;
|
|
383 }
|
|
384
|
|
385 namespace PR20625 {
|
|
386 template <typename T>
|
|
387 void f() {
|
|
388 struct N {
|
|
389 static constexpr int get() { return 42; }
|
|
390 };
|
|
391 constexpr int n = N::get();
|
|
392 static_assert(n == 42, "n == 42");
|
|
393 }
|
|
394
|
|
395 void g() { f<void>(); }
|
|
396 }
|
|
397
|
|
398
|
|
399 namespace PR21332 {
|
|
400 template<typename T> void f1() {
|
|
401 struct S { // expected-note{{in instantiation of member class 'S' requested here}}
|
|
402 void g1(int n = T::error); // expected-error{{type 'int' cannot be used prior to '::' because it has no members}}
|
|
403 };
|
|
404 }
|
|
405 template void f1<int>(); // expected-note{{in instantiation of function template specialization 'PR21332::f1<int>' requested here}}
|
|
406
|
|
407 template<typename T> void f2() {
|
|
408 struct S { // expected-note{{in instantiation of member class 'S' requested here}}
|
|
409 void g2() noexcept(T::error); // expected-error{{type 'int' cannot be used prior to '::' because it has no members}}
|
|
410 };
|
|
411 }
|
|
412 template void f2<int>(); // expected-note{{in instantiation of function template specialization 'PR21332::f2<int>' requested here}}
|
|
413
|
|
414 template<typename T> void f3() {
|
|
415 enum S {
|
|
416 val = T::error; // expected-error{{expected '}' or ','}} expected-error{{type 'int' cannot be used prior to '::' because it has no members}}
|
|
417 };
|
|
418 }
|
|
419 template void f3<int>(); //expected-note{{in instantiation of function template specialization 'PR21332::f3<int>' requested here}}
|
|
420
|
|
421 template<typename T> void f4() {
|
|
422 enum class S {
|
|
423 val = T::error; // expected-error{{expected '}' or ','}} expected-error{{type 'int' cannot be used prior to '::' because it has no members}}
|
|
424 };
|
|
425 }
|
|
426 template void f4<int>(); // expected-note{{in instantiation of function template specialization 'PR21332::f4<int>' requested here}}
|
|
427
|
|
428 template<typename T> void f5() {
|
|
429 class S { // expected-note {{in instantiation of default member initializer 'PR21332::f5()::S::val' requested here}}
|
|
430 int val = T::error; // expected-error {{type 'int' cannot be used prior to '::' because it has no members}}
|
|
431 };
|
|
432 }
|
|
433 template void f5<int>(); // expected-note {{in instantiation of function template specialization 'PR21332::f5<int>' requested here}}
|
|
434
|
|
435 template<typename T> void f6() {
|
|
436 class S { // expected-note {{in instantiation of member function 'PR21332::f6()::S::get' requested here}}
|
|
437 void get() {
|
|
438 class S2 { // expected-note {{in instantiation of member class 'S2' requested here}}
|
|
439 void g1(int n = T::error); // expected-error {{type 'int' cannot be used prior to '::' because it has no members}}
|
|
440 };
|
|
441 }
|
|
442 };
|
|
443 }
|
|
444 template void f6<int>(); // expected-note{{in instantiation of function template specialization 'PR21332::f6<int>' requested here}}
|
|
445
|
|
446 template<typename T> void f7() {
|
|
447 struct S { void g() noexcept(undefined_val); }; // expected-error{{use of undeclared identifier 'undefined_val'}}
|
|
448 }
|
|
449 template void f7<int>();
|
|
450 }
|
|
451
|
|
452 // rdar://23721638: Ensure that we correctly perform implicit
|
|
453 // conversions when instantiating the default arguments of local functions.
|
|
454 namespace rdar23721638 {
|
|
455 struct A {
|
|
456 A(const char *) = delete; // expected-note 2 {{explicitly marked deleted here}}
|
|
457 };
|
|
458
|
|
459 template <typename T> void foo() {
|
|
460 struct Inner { // expected-note {{in instantiation}}
|
|
461 void operator()(T a = "") {} // expected-error {{conversion function from 'const char [1]' to 'rdar23721638::A' invokes a deleted function}}
|
|
462 // expected-note@-1 {{passing argument to parameter 'a' here}}
|
|
463 // expected-note@-2 {{candidate function not viable}}
|
|
464 };
|
|
465 Inner()(); // expected-error {{no matching function}}
|
|
466 }
|
|
467 template void foo<A>(); // expected-note 2 {{in instantiation}}
|
|
468
|
|
469 template <typename T> void bar() {
|
|
470 auto lambda = [](T a = "") {}; // expected-error {{conversion function from 'const char [1]' to 'rdar23721638::A' invokes a deleted function}}
|
|
471 // expected-note@-1 {{passing argument to parameter 'a' here}}
|
|
472 // expected-note@-2 {{candidate function not viable}}
|
|
473 // expected-note@-3 {{conversion candidate of type}}
|
|
474 lambda(); // expected-error {{no matching function}}
|
|
475 }
|
|
476 template void bar<A>(); // expected-note {{in instantiation}}
|
|
477 }
|
|
478
|
|
479 namespace anon_union_default_member_init {
|
|
480 template<typename T> void f() {
|
|
481 struct S {
|
|
482 union {
|
|
483 int i = 0;
|
|
484 };
|
|
485 };
|
|
486 }
|
|
487 void g() { f<int>(); }
|
|
488 }
|