[PowerPC] Collect some CallLowering arguments into a struct. [NFC]
[llvm-project.git] / clang / test / SemaTemplate / instantiate-local-class.cpp
blobeaff4c4bbc8d9011c99d49a636aba2568df16ed6
1 // RUN: %clang_cc1 -verify -std=c++11 %s
2 // RUN: %clang_cc1 -verify -std=c++11 -fdelayed-template-parsing %s
4 template<typename T>
5 void f0() {
6 struct X;
7 typedef struct Y {
8 T (X::* f1())(int) { return 0; }
9 } Y2;
11 Y2 y = Y();
14 template void f0<int>();
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(); }
25 ValueType V;
28 Y y;
32 void test(X x) {
33 x.Bar<int>();
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 { };
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;}
48 Z z;
49 (void)z;
52 struct S { };
53 void test() { f<S>(); }
56 namespace PR8801 {
57 template<typename T>
58 void foo() {
59 class X;
60 typedef int (X::*pmf_type)();
61 class X : public T { };
63 pmf_type pmf = &T::foo;
66 struct Y { int foo(); };
68 template void foo<Y>();
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; }()...)) {}
76 void h() { S::f<int, int, int>(); }
79 namespace PR9685 {
80 template <class Thing> void forEach(Thing t) { t.func(); }
82 template <typename T> void doIt() {
83 struct Functor {
84 void func() { (void)i; }
85 int i;
88 forEach(Functor());
91 void call() {
92 doIt<int>();
96 namespace PR12702 {
97 struct S {
98 template <typename F> bool apply(F f) { return f(); }
101 template <typename> struct T {
102 void foo() {
103 struct F {
104 int x;
106 bool operator()() { return x == 0; }
109 S().apply(F());
113 void call() { T<int>().foo(); }
116 namespace PR17139 {
117 template <class T> void foo(const T &t) { t.foo(); }
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);
127 void go() {}
129 void test() { bar(go); }
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);
140 template <typename T> void C::foo(T function) { function(); }
142 template <typename T> void C::bar(T function) {
143 foo([&function]() { function(); });
146 template <typename T> void C::func(T function) {
147 struct Struct {
148 T mFunction;
150 Struct(T function) : mFunction(function) {};
152 void operator()() {
153 mFunction();
157 bar(Struct(function));
160 void call() {
161 C::func([]() {});
165 namespace PR14373 {
166 struct function {
167 template <typename _Functor> function(_Functor __f) { __f(); }
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;
175 return functor(f);
177 struct Type {
178 void operator()() const {}
180 int call() {
181 exec_func(Type());
182 return 0;
186 namespace PR18907 {
187 template <typename>
188 class C : public C<int> {}; // expected-error{{within its own definition}}
190 template <typename X>
191 void F() {
192 struct A : C<X> {};
195 struct B {
196 void f() { F<int>(); }
200 namespace PR23194 {
201 struct X {
202 int operator()() const { return 0; }
204 struct Y {
205 Y(int) {}
207 template <bool = true> int make_seed_pair() noexcept {
208 struct state_t {
209 X x;
210 Y y{x()};
212 return 0;
214 int func() {
215 return make_seed_pair();
219 namespace PR18653 {
220 // Forward declarations
222 template<typename T> void f1() {
223 void g1(struct x1);
224 struct x1 {};
226 template void f1<int>();
228 template<typename T> void f1a() {
229 void g1(union x1);
230 union x1 {};
232 template void f1a<int>();
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 };
238 template void f2<int>();
240 template<typename T> void f3() {
241 void g3(enum class x3);
242 enum class x3 { nothing };
244 template void f3<int>();
247 template<typename T> void f4() {
248 void g4(struct x4 {} x); // expected-error{{'x4' cannot be defined in a parameter type}}
250 template void f4<int>();
252 template<typename T> void f4a() {
253 void g4(union x4 {} x); // expected-error{{'x4' cannot be defined in a parameter type}}
255 template void f4a<int>();
258 template <class T> void f();
259 template <class T> struct S1 {
260 void m() {
261 f<class newclass>();
262 f<union newunion>();
265 template struct S1<int>;
267 template <class T> struct S2 {
268 void m() {
269 f<enum new_enum>(); // expected-error{{ISO C++ forbids forward references to 'enum' types}}
272 template struct S2<int>;
274 template <class T> struct S3 {
275 void m() {
276 f<enum class new_enum>();
279 template struct S3<int>;
281 template <class T> struct S4 {
282 struct local {};
283 void m() {
284 f<local>();
287 template struct S4<int>;
289 template <class T> struct S4a {
290 union local {};
291 void m() {
292 f<local>();
295 template struct S4a<int>;
297 template <class T> struct S5 {
298 enum local { nothing };
299 void m() {
300 f<local>();
303 template struct S5<int>;
305 template <class T> struct S7 {
306 enum class local { nothing };
307 void m() {
308 f<local>();
311 template struct S7<int>;
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);
322 template struct S01<int>;
324 template <class T> struct S01a {
325 union local { };
326 void m() {
327 local x;
328 fff(&x);
331 template struct S01a<int>;
333 template <class T> struct S02 {
334 enum local { nothing };
335 void m() {
336 local x;
337 fff(&x);
340 template struct S02<int>;
342 template <class T> struct S03 {
343 enum class local { nothing };
344 void m() {
345 local x;
346 fff(&x);
349 template struct S03<int>;
352 template <class T> struct S04 {
353 void m() {
354 struct { } x;
355 fff(&x);
358 template struct S04<int>;
360 template <class T> struct S04a {
361 void m() {
362 union { } x;
363 fff(&x);
366 template struct S04a<int>;
368 template <class T> struct S05 {
369 void m() {
370 enum { nothing } x;
371 fff(&x);
374 template struct S05<int>;
376 template <class T> struct S06 {
377 void m() {
378 class { virtual void mmm() {} } x;
379 fff(&x);
382 template struct S06<int>;
385 namespace PR20625 {
386 template <typename T>
387 void f() {
388 struct N {
389 static constexpr int get() { return 42; }
391 constexpr int n = N::get();
392 static_assert(n == 42, "n == 42");
395 void g() { f<void>(); }
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}}
405 template void f1<int>(); // expected-note{{in instantiation of function template specialization 'PR21332::f1<int>' requested here}}
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}}
412 template void f2<int>(); // expected-note{{in instantiation of function template specialization 'PR21332::f2<int>' requested here}}
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}}
419 template void f3<int>(); //expected-note{{in instantiation of function template specialization 'PR21332::f3<int>' requested here}}
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}}
426 template void f4<int>(); // expected-note{{in instantiation of function template specialization 'PR21332::f4<int>' requested here}}
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}}
433 template void f5<int>(); // expected-note {{in instantiation of function template specialization 'PR21332::f5<int>' requested here}}
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}}
444 template void f6<int>(); // expected-note{{in instantiation of function template specialization 'PR21332::f6<int>' requested here}}
446 template<typename T> void f7() {
447 struct S { void g() noexcept(undefined_val); }; // expected-error{{use of undeclared identifier 'undefined_val'}}
449 template void f7<int>();
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}}
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}}
465 Inner()(); // expected-error {{no matching function}}
467 template void foo<A>(); // expected-note 2 {{in instantiation}}
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}}
476 template void bar<A>(); // expected-note {{in instantiation}}
479 namespace anon_union_default_member_init {
480 template<typename T> void f() {
481 struct S {
482 union {
483 int i = 0;
487 void g() { f<int>(); }