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 Smith void 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 Smith void 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