1// RUN: %clang_cc1 -verify -std=c++11 %s 2// RUN: %clang_cc1 -verify -std=c++11 -fdelayed-template-parsing %s 3 4template<typename T> 5void f0() { 6 struct X; 7 typedef struct Y { 8 T (X::* f1())(int) { return 0; } 9 } Y2; 10 11 Y2 y = Y(); 12} 13 14template void f0<int>(); 15 16// PR5764 17namespace 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. 38namespace 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 56namespace 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 71namespace 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 79namespace 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 96namespace 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 116namespace 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 132namespace PR17740 { 133class C { 134public: 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 140template <typename T> void C::foo(T function) { function(); } 141 142template <typename T> void C::bar(T function) { 143 foo([&function]() { function(); }); 144} 145 146template <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 160void call() { 161 C::func([]() {}); 162} 163} 164 165namespace 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 186namespace PR18907 { 187template <typename> 188class C : public C<int> {}; // expected-error{{within its own definition}} 189 190template <typename X> 191void F() { 192 struct A : C<X> {}; 193} 194 195struct B { 196 void f() { F<int>(); } 197}; 198} 199 200namespace 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 219namespace 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 385namespace PR20625 { 386template <typename T> 387void 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 395void g() { f<void>(); } 396} 397 398 399namespace 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. 454namespace 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