1 // RUN: %clang_cc1 -fms-extensions -fsyntax-only -verify %s 2 3 4 class A { 5 public: 6 template <class U> A(U p)7 A(U p) { 8 } 9 template <> A(int p)10 A(int p) { // expected-warning{{explicit specialization of 'A' within class scope is a Microsoft extension}} 11 } 12 13 template <class U> f(U p)14 void f(U p) { 15 } 16 17 template <> f(int p)18 void f(int p) { // expected-warning{{explicit specialization of 'f' within class scope is a Microsoft extension}} 19 } 20 f(int p)21 void f(int p) { 22 } 23 }; 24 test1()25void test1() 26 { 27 A a(3); 28 char* b ; 29 a.f(b); 30 a.f<int>(99); 31 a.f(100); 32 } 33 34 35 36 37 template <class T> 38 class B { 39 public: 40 template <class U> B(U p)41 B(U p) { 42 } 43 template <> B(int p)44 B(int p) { // expected-warning{{explicit specialization of 'B<T>' within class scope is a Microsoft extension}} 45 } 46 47 template <class U> f(U p)48 void f(U p) { 49 T y = 9; 50 } 51 52 53 template <> f(int p)54 void f(int p) { // expected-warning{{explicit specialization of 'f' within class scope is a Microsoft extension}} 55 T a = 3; 56 } 57 f(int p)58 void f(int p) { 59 T a = 3; 60 } 61 }; 62 test2()63void test2() 64 { 65 B<char> b(3); 66 char* ptr; 67 b.f(ptr); 68 b.f<int>(99); 69 b.f(100); 70 } 71 72 73 namespace PR12709 { 74 75 template<class T> 76 class TemplateClass { member_function()77 void member_function() { 78 specialized_member_template<false>(); 79 } 80 81 template<bool b> specialized_member_template()82 void specialized_member_template() {} 83 84 template<> specialized_member_template()85 void specialized_member_template<false>() {} // expected-warning{{explicit specialization of 'specialized_member_template' within class scope is a Microsoft extension}} 86 }; 87 f()88void f() { 89 TemplateClass<int> t; 90 } 91 92 } 93