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 Livoid 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 Livoid 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