// 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>;
}
