// RUN: %clang_cc1 -fms-extensions -fsyntax-only -verify %s // RUN: %clang_cc1 -fms-extensions -fdelayed-template-parsing -fsyntax-only -verify %s class A { public: template A(U p) {} template<> A(int p) { // expected-warning@-1 {{explicit specialization of 'A' within class scope is a Microsoft extension}} } template void f(U p) {} template<> void f(int p) { // expected-warning@-1 {{explicit specialization of 'f' within class scope is a Microsoft extension}} } void f(int p) {} }; void test1() { A a(3); char *b; a.f(b); a.f(99); a.f(100); } template class B { public: template B(U p) {} template<> B(int p) { // expected-warning@-1 {{explicit specialization of 'B' within class scope is a Microsoft extension}} } template void f(U p) { T y = 9; } template<> void f(int p) { // expected-warning@-1 {{explicit specialization of 'f' within class scope is a Microsoft extension}} T a = 3; } void f(int p) { T a = 3; } }; void test2() { B b(3); char *ptr; b.f(ptr); b.f(99); b.f(100); } namespace PR12709 { template class TemplateClass { void member_function() { specialized_member_template(); } template void specialized_member_template() {} template<> void specialized_member_template() { // expected-warning@-1 {{explicit specialization of 'specialized_member_template' within class scope is a Microsoft extension}} } }; void f() { TemplateClass t; } } namespace Duplicates { template struct A { template void f(); template<> void f() {} // expected-warning {{Microsoft extension}} template<> void f() {} // expected-warning {{Microsoft extension}} }; // FIXME: We should diagnose the duplicate explicit specialization definitions // here. template struct A; } namespace PR28082 { struct S { template int f(int = 0); template <> int f<0>(int); // expected-warning {{Microsoft extension}} }; }