608 lines · cpp
1// RUN: %clang_cc1 -fms-extensions -fsyntax-only -Wno-unused-value -verify %s2// RUN: %clang_cc1 -fms-extensions -fdelayed-template-parsing -fsyntax-only -Wno-unused-value -verify %s3 4class A {5public:6 template<class U> A(U p) {}7 template<> A(int p) {}8 9 template<class U> void f(U p) {}10 11 template<> void f(int p) {}12 13 void f(int p) {}14};15 16void test1() {17 A a(3);18 char *b;19 a.f(b);20 a.f<int>(99);21 a.f(100);22}23 24template<class T> class B {25public:26 template<class U> B(U p) {}27 template<> B(int p) {}28 29 template<class U> void f(U p) { T y = 9; }30 31 template<> void f(int p) {32 T a = 3;33 }34 35 void f(int p) { T a = 3; }36};37 38void test2() {39 B<char> b(3);40 char *ptr;41 b.f(ptr);42 b.f<int>(99);43 b.f(100);44}45 46namespace PR12709 {47 template<class T> class TemplateClass {48 void member_function() { specialized_member_template<false>(); }49 50 template<bool b> void specialized_member_template() {}51 52 template<> void specialized_member_template<false>() {}53 };54 55 void f() { TemplateClass<int> t; }56}57 58namespace Duplicates {59 template<typename T> struct A {60 template<typename U> void f();61 template<> void f<int>() {}62 template<> void f<T>() {}63 };64 65 // FIXME: We should diagnose the duplicate explicit specialization definitions66 // here.67 template struct A<int>;68}69 70namespace PR28082 {71struct S {72 template <int>73 int f(int = 0);74 template <>75 int f<0>(int);76};77}78 79namespace UsesThis {80 template<typename T>81 struct A {82 int x;83 84 static inline int y;85 86 template<typename U = void>87 static void f();88 89 template<typename U = void>90 void g();91 92 template<typename U>93 static auto h() -> A*;94 95 void i();96 97 static void j();98 99 template<>100 void f<int>() {101 this->x; // expected-error {{invalid use of 'this' outside of a non-static member function}}102 x; // expected-error {{invalid use of member 'x' in static member function}}103 A::x; // expected-error {{invalid use of member 'x' in static member function}}104 +x; // expected-error {{invalid use of member 'x' in static member function}}105 +A::x; // expected-error {{invalid use of member 'x' in static member function}}106 &x; // expected-error {{invalid use of member 'x' in static member function}}107 &A::x;108 this->y; // expected-error {{invalid use of 'this' outside of a non-static member function}}109 y;110 A::y;111 +y;112 +A::y;113 &y;114 &A::y;115 f();116 f<void>();117 g(); // expected-error {{call to non-static member function without an object argument}}118 g<void>(); // expected-error {{call to non-static member function without an object argument}}119 i(); // expected-error {{call to non-static member function without an object argument}}120 j();121 &i; // expected-error 2{{must explicitly qualify name of member function when taking its address}}122 &j;123 &A::i;124 &A::j;125 }126 127 template<>128 void g<int>() {129 this->x;130 x;131 A::x;132 +x;133 +A::x;134 &x;135 &A::x;136 this->y;137 y;138 A::y;139 +y;140 +A::y;141 &y;142 &A::y;143 f();144 f<void>();145 g();146 g<void>();147 i();148 j();149 &i; // expected-error 2{{must explicitly qualify name of member function when taking its address}}150 &j;151 &A::i;152 &A::j;153 }154 155 template<>156 auto h<int>() -> decltype(this); // expected-error {{'this' cannot be used in a static member function declaration}}157 };158 159 template struct A<int>; // expected-note {{in instantiation of}}160 template<> template<> void A<int>::f<int>();161 template<> template<> void A<int>::g<int>();162 void test1() {163 A<int>().f<int>(); // expected-note {{in instantiation of}}164 A<int>().g<int>(); // expected-note {{in instantiation of}}165 }166 167 template <typename T>168 struct Foo {169 template <typename X>170 int bar(X x) {171 return 0;172 }173 174 template <>175 int bar(int x) {176 return bar(5.0); // ok177 }178 };179 180 void call() {181 Foo<double> f;182 f.bar(1);183 }184 185 struct B {186 int x0;187 static inline int y0;188 189 int f0(int);190 static int g0(int);191 192 int x2;193 static inline int y2;194 195 int f2(int);196 static int g2(int);197 };198 199 template<typename T>200 struct D : B {201 int x1;202 static inline int y1;203 204 int f1(int);205 static int g1(int);206 207 using B::x2;208 using B::y2;209 using B::f2;210 using B::g2;211 212 template<typename U>213 void non_static_spec(U);214 215 template<typename U>216 static void static_spec(U);217 218 template<>219 void non_static_spec(int z) {220 ++z;221 ++x0;222 ++x1;223 ++x2;224 ++y0;225 ++y1;226 ++y2;227 228 &z;229 &x0;230 &x1;231 &x2;232 &y0;233 &y1;234 &y2;235 236 &f0; // expected-error {{must explicitly qualify name of member function when taking its address}}237 &f1; // expected-error 2{{must explicitly qualify name of member function when taking its address}}238 &f2; // expected-error 2{{must explicitly qualify name of member function when taking its address}}239 &g0;240 &g1;241 &g2;242 243 &B::x0;244 &D::x1;245 &B::x2;246 &B::y0;247 &D::y1;248 &B::y2;249 &B::f0;250 &D::f1;251 &B::f2;252 &B::g0;253 &D::g1;254 &B::g2;255 256 f0(0);257 f0(z);258 f0(x0);259 f0(x1);260 f0(x2);261 f0(y0);262 f0(y1);263 f0(y2);264 g0(0);265 g0(z);266 g0(x0);267 g0(x1);268 g0(x2);269 g0(y0);270 g0(y1);271 g0(y2);272 273 f1(0);274 f1(z);275 f1(x0);276 f1(x1);277 f1(x2);278 f1(y0);279 f1(y1);280 f1(y2);281 g1(0);282 g1(z);283 g1(x0);284 g1(x1);285 g1(x2);286 g1(y0);287 g1(y1);288 g1(y2);289 290 f2(0);291 f2(z);292 f2(x0);293 f2(x1);294 f2(x2);295 f2(y0);296 f2(y1);297 f2(y2);298 g2(0);299 g2(z);300 g2(x0);301 g2(x1);302 g2(x2);303 g2(y0);304 g2(y1);305 g2(y2);306 }307 308 template<>309 void static_spec(int z) {310 ++z;311 ++x0; // expected-error {{invalid use of member 'x0' in static member function}}312 ++x1; // expected-error {{invalid use of member 'x1' in static member function}}313 ++x2; // expected-error {{invalid use of member 'x2' in static member function}}314 ++y0;315 ++y1;316 ++y2;317 318 &z;319 &x0; // expected-error {{invalid use of member 'x0' in static member function}}320 &x1; // expected-error {{invalid use of member 'x1' in static member function}}321 &x2; // expected-error {{invalid use of member 'x2' in static member function}}322 &y0;323 &y1;324 &y2;325 326 &f0; // expected-error {{must explicitly qualify name of member function when taking its address}}327 &f1; // expected-error 2{{must explicitly qualify name of member function when taking its address}}328 &f2; // expected-error 2{{must explicitly qualify name of member function when taking its address}}329 &g0;330 &g1;331 &g2;332 333 &B::x0;334 &D::x1;335 &B::x2;336 &B::y0;337 &D::y1;338 &B::y2;339 &B::f0;340 &D::f1;341 &B::f2;342 &B::g0;343 &D::g1;344 &B::g2;345 346 f0(0); // expected-error {{call to non-static member function without an object argument}}347 f0(z); // expected-error {{call to non-static member function without an object argument}}348 f0(x0); // expected-error {{call to non-static member function without an object argument}}349 f0(x1); // expected-error {{call to non-static member function without an object argument}}350 f0(x2); // expected-error {{call to non-static member function without an object argument}}351 f0(y0); // expected-error {{call to non-static member function without an object argument}}352 f0(y1); // expected-error {{call to non-static member function without an object argument}}353 f0(y2); // expected-error {{call to non-static member function without an object argument}}354 g0(0);355 g0(z);356 g0(x0); // expected-error {{invalid use of member 'x0' in static member function}}357 g0(x1); // expected-error {{invalid use of member 'x1' in static member function}}358 g0(x2); // expected-error {{invalid use of member 'x2' in static member function}}359 g0(y0);360 g0(y1);361 g0(y2);362 363 f1(0); // expected-error {{call to non-static member function without an object argument}}364 f1(z); // expected-error {{call to non-static member function without an object argument}}365 f1(x0); // expected-error {{call to non-static member function without an object argument}}366 f1(x1); // expected-error {{call to non-static member function without an object argument}}367 f1(x2); // expected-error {{call to non-static member function without an object argument}}368 f1(y0); // expected-error {{call to non-static member function without an object argument}}369 f1(y1); // expected-error {{call to non-static member function without an object argument}}370 f1(y2); // expected-error {{call to non-static member function without an object argument}}371 g1(0);372 g1(z);373 g1(x0); // expected-error {{invalid use of member 'x0' in static member function}}374 g1(x1); // expected-error {{invalid use of member 'x1' in static member function}}375 g1(x2); // expected-error {{invalid use of member 'x2' in static member function}}376 g1(y0);377 g1(y1);378 g1(y2);379 380 f2(0); // expected-error {{call to non-static member function without an object argument}}381 f2(z); // expected-error {{call to non-static member function without an object argument}}382 f2(x0); // expected-error {{call to non-static member function without an object argument}}383 f2(x1); // expected-error {{call to non-static member function without an object argument}}384 f2(x2); // expected-error {{call to non-static member function without an object argument}}385 f2(y0); // expected-error {{call to non-static member function without an object argument}}386 f2(y1); // expected-error {{call to non-static member function without an object argument}}387 f2(y2); // expected-error {{call to non-static member function without an object argument}}388 g2(0);389 g2(z);390 g2(x0); // expected-error {{invalid use of member 'x0' in static member function}}391 g2(x1); // expected-error {{invalid use of member 'x1' in static member function}}392 g2(x2); // expected-error {{invalid use of member 'x2' in static member function}}393 g2(y0);394 g2(y1);395 g2(y2);396 }397 };398 399 template struct D<int>;400 401 void test2() {402 D<int>().non_static_spec(0); // expected-note {{in instantiation of}}403 D<int>().static_spec(0); // expected-note {{in instantiation of}}404 }405 406 template<typename T>407 struct E : T {408 int x1;409 static inline int y1;410 411 int f1(int);412 static int g1(int);413 414 using T::x0;415 using T::y0;416 using T::f0;417 using T::g0;418 419 template<typename U>420 void non_static_spec(U);421 422 template<typename U>423 static void static_spec(U);424 425 template<>426 void non_static_spec(int z) {427 ++z;428 ++x0;429 ++x1;430 ++y0;431 ++y1;432 433 &z;434 &x0;435 &x1;436 &y0;437 &y1;438 439 &f0; // expected-error {{must explicitly qualify name of member function when taking its address}}440 &f1; // expected-error 2{{must explicitly qualify name of member function when taking its address}}441 &g0;442 &g1;443 444 &T::x0;445 &E::x1;446 &T::y0;447 &E::y1;448 &T::f0;449 &E::f1;450 &T::g0;451 &E::g1;452 453 f0(0);454 f0(z);455 f0(x0);456 f0(x1);457 f0(y0);458 f0(y1);459 g0(0);460 g0(z);461 g0(x0);462 g0(x1);463 g0(y0);464 g0(y1);465 466 f1(0);467 f1(z);468 f1(x0);469 f1(x1);470 f1(y0);471 f1(y1);472 g1(0);473 g1(z);474 g1(x0);475 g1(x1);476 g1(y0);477 g1(y1);478 479 T::f0(0);480 T::f0(z);481 T::f0(x0);482 T::f0(x1);483 T::f0(y0);484 T::f0(y1);485 T::g0(0);486 T::g0(z);487 T::g0(x0);488 T::g0(x1);489 T::g0(y0);490 T::g0(y1);491 492 E::f1(0);493 E::f1(z);494 E::f1(x0);495 E::f1(x1);496 E::f1(y0);497 E::f1(y1);498 E::g1(0);499 E::g1(z);500 E::g1(x0);501 E::g1(x1);502 E::g1(y0);503 E::g1(y1);504 }505 506 template<>507 void static_spec(int z) {508 ++z;509 ++x0; // expected-error {{invalid use of member 'x0' in static member function}}510 ++x1; // expected-error {{invalid use of member 'x1' in static member function}}511 ++y0;512 ++y1;513 514 &z;515 &x0; // expected-error {{invalid use of member 'x0' in static member function}}516 &x1; // expected-error {{invalid use of member 'x1' in static member function}}517 &y0;518 &y1;519 520 &f0; // expected-error {{must explicitly qualify name of member function when taking its address}}521 &f1; // expected-error 2{{must explicitly qualify name of member function when taking its address}}522 &g0;523 &g1;524 525 &T::x0;526 &E::x1;527 &T::y0;528 &E::y1;529 &T::f0;530 &E::f1;531 &T::g0;532 &E::g1;533 534 f0(0); // expected-error {{call to non-static member function without an object argument}}535 f0(z); // expected-error {{call to non-static member function without an object argument}}536 f0(x0); // expected-error {{call to non-static member function without an object argument}}537 f0(x1); // expected-error {{call to non-static member function without an object argument}}538 f0(y0); // expected-error {{call to non-static member function without an object argument}}539 f0(y1); // expected-error {{call to non-static member function without an object argument}}540 g0(0);541 g0(z);542 g0(x0); // expected-error {{invalid use of member 'x0' in static member function}}543 g0(x1); // expected-error {{invalid use of member 'x1' in static member function}}544 g0(y0);545 g0(y1);546 547 f1(0); // expected-error {{call to non-static member function without an object argument}}548 f1(z); // expected-error {{call to non-static member function without an object argument}}549 f1(x0); // expected-error {{call to non-static member function without an object argument}}550 f1(x1); // expected-error {{call to non-static member function without an object argument}}551 f1(y0); // expected-error {{call to non-static member function without an object argument}}552 f1(y1); // expected-error {{call to non-static member function without an object argument}}553 g1(0);554 g1(z);555 g1(x0); // expected-error {{invalid use of member 'x0' in static member function}}556 g1(x1); // expected-error {{invalid use of member 'x1' in static member function}}557 g1(y0);558 g1(y1);559 560 T::f0(0); // expected-error {{call to non-static member function without an object argument}}561 T::f0(z); // expected-error {{call to non-static member function without an object argument}}562 T::f0(x0); // expected-error {{call to non-static member function without an object argument}}563 T::f0(x1); // expected-error {{call to non-static member function without an object argument}}564 T::f0(y0); // expected-error {{call to non-static member function without an object argument}}565 T::f0(y1); // expected-error {{call to non-static member function without an object argument}}566 T::g0(0);567 T::g0(z);568 T::g0(x0); // expected-error {{invalid use of member 'x0' in static member function}}569 T::g0(x1); // expected-error {{invalid use of member 'x1' in static member function}}570 T::g0(y0);571 T::g0(y1);572 573 E::f1(0); // expected-error {{call to non-static member function without an object argument}}574 E::f1(z); // expected-error {{call to non-static member function without an object argument}}575 E::f1(x0); // expected-error {{call to non-static member function without an object argument}}576 E::f1(x1); // expected-error {{call to non-static member function without an object argument}}577 E::f1(y0); // expected-error {{call to non-static member function without an object argument}}578 E::f1(y1); // expected-error {{call to non-static member function without an object argument}}579 E::g1(0);580 E::g1(z);581 E::g1(x0); // expected-error {{invalid use of member 'x0' in static member function}}582 E::g1(x1); // expected-error {{invalid use of member 'x1' in static member function}}583 E::g1(y0);584 E::g1(y1);585 }586 };587 588 template struct E<B>;589 590 void test3() {591 E<B>().non_static_spec(0); // expected-note {{in instantiation of}}592 E<B>().static_spec(0); // expected-note {{in instantiation of}}593 }594}595 596namespace GH111266 {597 template<class T> struct S {598 template<int> auto foo();599 template<> auto foo<1>() {600 return [](auto x) { return x; };601 }602 };603 template struct S<void>;604 void test() {605 S<void>().foo<1>();606 }607} // namespace GH111266608