100c7e6ceSFrancois Pichet // RUN: %clang_cc1 -fms-extensions -fsyntax-only -verify %s 207cea191SRichard Smith // RUN: %clang_cc1 -fms-extensions -fdelayed-template-parsing -fsyntax-only -verify %s 300c7e6ceSFrancois Pichet 4*c660c8f5SRichard Smith // expected-no-diagnostics 500c7e6ceSFrancois Pichet class A { 600c7e6ceSFrancois Pichet public: A(U p)73c9198fcSRichard Smith template<class U> A(U p) {} A(int p)8*c660c8f5SRichard Smith template<> A(int p) {} 900c7e6ceSFrancois Pichet f(U p)103c9198fcSRichard Smith template<class U> void f(U p) {} 113c9198fcSRichard Smith f(int p)12*c660c8f5SRichard Smith template<> void f(int p) {} 1300c7e6ceSFrancois Pichet f(int p)143c9198fcSRichard Smith void f(int p) {} 1500c7e6ceSFrancois Pichet }; 1600c7e6ceSFrancois Pichet test1()173c9198fcSRichard Smithvoid test1() { 1800c7e6ceSFrancois Pichet A a(3); 1900c7e6ceSFrancois Pichet char *b; 2000c7e6ceSFrancois Pichet a.f(b); 2100c7e6ceSFrancois Pichet a.f<int>(99); 2200c7e6ceSFrancois Pichet a.f(100); 2300c7e6ceSFrancois Pichet } 2400c7e6ceSFrancois Pichet 253c9198fcSRichard Smith template<class T> class B { 2600c7e6ceSFrancois Pichet public: B(U p)273c9198fcSRichard Smith template<class U> B(U p) {} B(int p)28*c660c8f5SRichard Smith template<> B(int p) {} 2900c7e6ceSFrancois Pichet f(U p)303c9198fcSRichard Smith template<class U> void f(U p) { T y = 9; } 3100c7e6ceSFrancois Pichet f(int p)323c9198fcSRichard Smith template<> void f(int p) { 3300c7e6ceSFrancois Pichet T a = 3; 3400c7e6ceSFrancois Pichet } 3500c7e6ceSFrancois Pichet f(int p)363c9198fcSRichard Smith void f(int p) { T a = 3; } 3700c7e6ceSFrancois Pichet }; 3800c7e6ceSFrancois Pichet test2()393c9198fcSRichard Smithvoid test2() { 4000c7e6ceSFrancois Pichet B<char> b(3); 4100c7e6ceSFrancois Pichet char *ptr; 4200c7e6ceSFrancois Pichet b.f(ptr); 4300c7e6ceSFrancois Pichet b.f<int>(99); 4400c7e6ceSFrancois Pichet b.f(100); 4500c7e6ceSFrancois Pichet } 4600c7e6ceSFrancois Pichet 477b5a716fSNico Weber namespace PR12709 { 483c9198fcSRichard Smith template<class T> class TemplateClass { member_function()493c9198fcSRichard Smith void member_function() { specialized_member_template<false>(); } 503c9198fcSRichard Smith specialized_member_template()513c9198fcSRichard Smith template<bool b> void specialized_member_template() {} 523c9198fcSRichard Smith specialized_member_template()53*c660c8f5SRichard Smith template<> void specialized_member_template<false>() {} 547b5a716fSNico Weber }; 557b5a716fSNico Weber f()563c9198fcSRichard Smith void f() { TemplateClass<int> t; } 577b5a716fSNico Weber } 586cda8ee9SRichard Smith 596cda8ee9SRichard Smith namespace Duplicates { 606cda8ee9SRichard Smith template<typename T> struct A { 616cda8ee9SRichard Smith template<typename U> void f(); fDuplicates::A62*c660c8f5SRichard Smith template<> void f<int>() {} fDuplicates::A63*c660c8f5SRichard Smith template<> void f<T>() {} 646cda8ee9SRichard Smith }; 656cda8ee9SRichard Smith 666cda8ee9SRichard Smith // FIXME: We should diagnose the duplicate explicit specialization definitions 676cda8ee9SRichard Smith // here. 686cda8ee9SRichard Smith template struct A<int>; 696cda8ee9SRichard Smith } 70cef7d378SDavid Majnemer 71cef7d378SDavid Majnemer namespace PR28082 { 72cef7d378SDavid Majnemer struct S { 73cef7d378SDavid Majnemer template <int> 74cef7d378SDavid Majnemer int f(int = 0); 75cef7d378SDavid Majnemer template <> 76*c660c8f5SRichard Smith int f<0>(int); 77cef7d378SDavid Majnemer }; 78cef7d378SDavid Majnemer } 79