xref: /aosp_15_r20/external/clang/test/SemaTemplate/ms-function-specialization-class-scope.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -fms-extensions -fsyntax-only -verify %s
2*67e74705SXin Li // RUN: %clang_cc1 -fms-extensions -fdelayed-template-parsing -fsyntax-only -verify %s
3*67e74705SXin Li 
4*67e74705SXin Li class A {
5*67e74705SXin Li public:
A(U p)6*67e74705SXin Li   template<class U> A(U p) {}
A(int p)7*67e74705SXin Li   template<> A(int p) {
8*67e74705SXin Li     // expected-warning@-1 {{explicit specialization of 'A' within class scope is a Microsoft extension}}
9*67e74705SXin Li   }
10*67e74705SXin Li 
f(U p)11*67e74705SXin Li   template<class U> void f(U p) {}
12*67e74705SXin Li 
f(int p)13*67e74705SXin Li   template<> void f(int p) {
14*67e74705SXin Li     // expected-warning@-1 {{explicit specialization of 'f' within class scope is a Microsoft extension}}
15*67e74705SXin Li   }
16*67e74705SXin Li 
f(int p)17*67e74705SXin Li   void f(int p) {}
18*67e74705SXin Li };
19*67e74705SXin Li 
test1()20*67e74705SXin Li void test1() {
21*67e74705SXin Li   A a(3);
22*67e74705SXin Li   char *b;
23*67e74705SXin Li   a.f(b);
24*67e74705SXin Li   a.f<int>(99);
25*67e74705SXin Li   a.f(100);
26*67e74705SXin Li }
27*67e74705SXin Li 
28*67e74705SXin Li template<class T> class B {
29*67e74705SXin Li public:
B(U p)30*67e74705SXin Li   template<class U> B(U p) {}
B(int p)31*67e74705SXin Li   template<> B(int p) {
32*67e74705SXin Li     // expected-warning@-1 {{explicit specialization of 'B<T>' within class scope is a Microsoft extension}}
33*67e74705SXin Li   }
34*67e74705SXin Li 
f(U p)35*67e74705SXin Li   template<class U> void f(U p) { T y = 9; }
36*67e74705SXin Li 
f(int p)37*67e74705SXin Li   template<> void f(int p) {
38*67e74705SXin Li     // expected-warning@-1 {{explicit specialization of 'f' within class scope is a Microsoft extension}}
39*67e74705SXin Li     T a = 3;
40*67e74705SXin Li   }
41*67e74705SXin Li 
f(int p)42*67e74705SXin Li   void f(int p) { T a = 3; }
43*67e74705SXin Li };
44*67e74705SXin Li 
test2()45*67e74705SXin Li void test2() {
46*67e74705SXin Li   B<char> b(3);
47*67e74705SXin Li   char *ptr;
48*67e74705SXin Li   b.f(ptr);
49*67e74705SXin Li   b.f<int>(99);
50*67e74705SXin Li   b.f(100);
51*67e74705SXin Li }
52*67e74705SXin Li 
53*67e74705SXin Li namespace PR12709 {
54*67e74705SXin Li   template<class T> class TemplateClass {
member_function()55*67e74705SXin Li     void member_function() { specialized_member_template<false>(); }
56*67e74705SXin Li 
specialized_member_template()57*67e74705SXin Li     template<bool b> void specialized_member_template() {}
58*67e74705SXin Li 
specialized_member_template()59*67e74705SXin Li     template<> void specialized_member_template<false>() {
60*67e74705SXin Li       // expected-warning@-1 {{explicit specialization of 'specialized_member_template' within class scope is a Microsoft extension}}
61*67e74705SXin Li     }
62*67e74705SXin Li   };
63*67e74705SXin Li 
f()64*67e74705SXin Li   void f() { TemplateClass<int> t; }
65*67e74705SXin Li }
66*67e74705SXin Li 
67*67e74705SXin Li namespace Duplicates {
68*67e74705SXin Li   template<typename T> struct A {
69*67e74705SXin Li     template<typename U> void f();
fDuplicates::A70*67e74705SXin Li     template<> void f<int>() {} // expected-warning {{Microsoft extension}}
fDuplicates::A71*67e74705SXin Li     template<> void f<T>() {} // expected-warning {{Microsoft extension}}
72*67e74705SXin Li   };
73*67e74705SXin Li 
74*67e74705SXin Li   // FIXME: We should diagnose the duplicate explicit specialization definitions
75*67e74705SXin Li   // here.
76*67e74705SXin Li   template struct A<int>;
77*67e74705SXin Li }
78*67e74705SXin Li 
79*67e74705SXin Li namespace PR28082 {
80*67e74705SXin Li struct S {
81*67e74705SXin Li   template <int>
82*67e74705SXin Li   int f(int = 0);
83*67e74705SXin Li   template <>
84*67e74705SXin Li   int f<0>(int); // expected-warning {{Microsoft extension}}
85*67e74705SXin Li };
86*67e74705SXin Li }
87