// 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<class U> A(U p) {} template<> A(int p) { // expected-warning@-1 {{explicit specialization of 'A' within class scope is a Microsoft extension}} } template<class U> 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<int>(99); a.f(100); } template<class T> class B { public: template<class U> B(U p) {} template<> B(int p) { // expected-warning@-1 {{explicit specialization of 'B<T>' within class scope is a Microsoft extension}} } template<class U> 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<char> b(3); char *ptr; b.f(ptr); b.f<int>(99); b.f(100); } namespace PR12709 { template<class T> class TemplateClass { void member_function() { specialized_member_template<false>(); } template<bool b> void specialized_member_template() {} template<> void specialized_member_template<false>() { // expected-warning@-1 {{explicit specialization of 'specialized_member_template' within class scope is a Microsoft extension}} } }; void f() { TemplateClass<int> t; } } namespace Duplicates { template<typename T> struct A { template<typename U> void f(); template<> void f<int>() {} // expected-warning {{Microsoft extension}} template<> void f<T>() {} // expected-warning {{Microsoft extension}} }; // FIXME: We should diagnose the duplicate explicit specialization definitions // here. template struct A<int>; }