[AMDGPU][True16][CodeGen] true16 codegen pattern for v_med3_u/i16 (#121850)
[llvm-project.git] / clang / test / SemaTemplate / ms-function-specialization-class-scope.cpp
blobaacc092c2c66ca594eb38ad250c6230c8cd3ae7b
1 // RUN: %clang_cc1 -fms-extensions -fsyntax-only -Wno-unused-value -verify %s
2 // RUN: %clang_cc1 -fms-extensions -fdelayed-template-parsing -fsyntax-only -Wno-unused-value -verify %s
4 class A {
5 public:
6 template<class U> A(U p) {}
7 template<> A(int p) {}
9 template<class U> void f(U p) {}
11 template<> void f(int p) {}
13 void f(int p) {}
16 void test1() {
17 A a(3);
18 char *b;
19 a.f(b);
20 a.f<int>(99);
21 a.f(100);
24 template<class T> class B {
25 public:
26 template<class U> B(U p) {}
27 template<> B(int p) {}
29 template<class U> void f(U p) { T y = 9; }
31 template<> void f(int p) {
32 T a = 3;
35 void f(int p) { T a = 3; }
38 void test2() {
39 B<char> b(3);
40 char *ptr;
41 b.f(ptr);
42 b.f<int>(99);
43 b.f(100);
46 namespace PR12709 {
47 template<class T> class TemplateClass {
48 void member_function() { specialized_member_template<false>(); }
50 template<bool b> void specialized_member_template() {}
52 template<> void specialized_member_template<false>() {}
55 void f() { TemplateClass<int> t; }
58 namespace Duplicates {
59 template<typename T> struct A {
60 template<typename U> void f();
61 template<> void f<int>() {}
62 template<> void f<T>() {}
65 // FIXME: We should diagnose the duplicate explicit specialization definitions
66 // here.
67 template struct A<int>;
70 namespace PR28082 {
71 struct S {
72 template <int>
73 int f(int = 0);
74 template <>
75 int f<0>(int);
79 namespace UsesThis {
80 template<typename T>
81 struct A {
82 int x;
84 static inline int y;
86 template<typename U = void>
87 static void f();
89 template<typename U = void>
90 void g();
92 template<typename U>
93 static auto h() -> A*;
95 void i();
97 static void j();
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}}
110 A::y;
112 +A::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}}
123 &A::i;
124 &A::j;
127 template<>
128 void g<int>() {
129 this->x;
131 A::x;
133 +A::x;
135 &A::x;
136 this->y;
138 A::y;
140 +A::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}}
151 &A::i;
152 &A::j;
155 template<>
156 auto h<int>() -> decltype(this); // expected-error {{'this' cannot be used in a static member function declaration}}
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}}
167 template <typename T>
168 struct Foo {
169 template <typename X>
170 int bar(X x) {
171 return 0;
174 template <>
175 int bar(int x) {
176 return bar(5.0); // ok
180 void call() {
181 Foo<double> f;
182 f.bar(1);
185 struct B {
186 int x0;
187 static inline int y0;
189 int f0(int);
190 static int g0(int);
192 int x2;
193 static inline int y2;
195 int f2(int);
196 static int g2(int);
199 template<typename T>
200 struct D : B {
201 int x1;
202 static inline int y1;
204 int f1(int);
205 static int g1(int);
207 using B::x2;
208 using B::y2;
209 using B::f2;
210 using B::g2;
212 template<typename U>
213 void non_static_spec(U);
215 template<typename U>
216 static void static_spec(U);
218 template<>
219 void non_static_spec(int z) {
220 ++z;
221 ++x0;
222 ++x1;
223 ++x2;
224 ++y0;
225 ++y1;
226 ++y2;
229 &x0;
230 &x1;
231 &x2;
232 &y0;
233 &y1;
234 &y2;
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;
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;
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);
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);
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);
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;
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;
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;
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;
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);
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);
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);
399 template struct D<int>;
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}}
406 template<typename T>
407 struct E : T {
408 int x1;
409 static inline int y1;
411 int f1(int);
412 static int g1(int);
414 using T::x0;
415 using T::y0;
416 using T::f0;
417 using T::g0;
419 template<typename U>
420 void non_static_spec(U);
422 template<typename U>
423 static void static_spec(U);
425 template<>
426 void non_static_spec(int z) {
427 ++z;
428 ++x0;
429 ++x1;
430 ++y0;
431 ++y1;
434 &x0;
435 &x1;
436 &y0;
437 &y1;
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;
444 &T::x0;
445 &E::x1;
446 &T::y0;
447 &E::y1;
448 &T::f0;
449 &E::f1;
450 &T::g0;
451 &E::g1;
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);
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);
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);
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);
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;
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;
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;
525 &T::x0;
526 &E::x1;
527 &T::y0;
528 &E::y1;
529 &T::f0;
530 &E::f1;
531 &T::g0;
532 &E::g1;
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);
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);
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);
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);
588 template struct E<B>;
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}}
596 namespace GH111266 {
597 template<class T> struct S {
598 template<int> auto foo();
599 template<> auto foo<1>() {
600 return [](auto x) { return x; };
603 template struct S<void>;
604 void test() {
605 S<void>().foo<1>();
607 } // namespace GH111266