// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s

// This test creates cases where implicit instantiations of various entities
// would cause a diagnostic, but provides expliict specializations for those
// entities that avoid the diagnostic. The specializations are alternately
// declarations and definitions, and the intent of this test is to verify
// that we allow specializations only in the appropriate namespaces (and
// nowhere else).
struct NonDefaultConstructible {
  NonDefaultConstructible(int);
};


// C++ [temp.expl.spec]p1:
//   An explicit specialization of any of the following:

//     -- function template
namespace N0 {
  template<typename T> void f0(T) {
    T t;
  }

  template<> void f0(NonDefaultConstructible) { }

  void test_f0(NonDefaultConstructible NDC) {
    f0(NDC);
  }
  
  template<> void f0(int);
  template<> void f0(long);
}

template<> void N0::f0(int) { } // okay

namespace N1 {
  template<> void N0::f0(long) { } // expected-error{{does not enclose namespace}}
}

template<> void N0::f0(double) { }

struct X1 {
  template<typename T> void f(T);
  
  template<> void f(int); // expected-error{{in class scope}}
};

//     -- class template
namespace N0 {
  
template<typename T>
struct X0 { // expected-note {{here}}
  static T member;
  
  void f1(T t) {
    t = 17;
  }
  
  struct Inner : public T { }; // expected-note 2{{here}}
  
  template<typename U>
  struct InnerTemplate : public T { }; // expected-note 1{{explicitly specialized}} \
   // expected-error{{base specifier}}
  
  template<typename U>
  void ft1(T t, U u);
};

}

template<typename T> 
template<typename U>
void N0::X0<T>::ft1(T t, U u) {
  t = u;
}

template<typename T> T N0::X0<T>::member;

template<> struct N0::X0<void> { };
N0::X0<void> test_X0;

namespace N1 {
  template<> struct N0::X0<const void> { }; // expected-error{{class template specialization of 'X0' must originally be declared in namespace 'N0'}}
}

namespace N0 {
  template<> struct X0<volatile void>;
}

template<> struct N0::X0<volatile void> { 
  void f1(void *);
};

//     -- member function of a class template
template<> void N0::X0<void*>::f1(void *) { }

void test_spec(N0::X0<void*> xvp, void *vp) {
  xvp.f1(vp);
}

namespace N0 {
  template<> void X0<volatile void>::f1(void *) { } // expected-error{{no function template matches}}

  template<> void X0<const volatile void*>::f1(const volatile void*);
}

void test_x0_cvvoid(N0::X0<const volatile void*> x0, const volatile void *cvp) {
  x0.f1(cvp); // okay: we've explicitly specialized
}

//     -- static data member of a class template
namespace N0 {
  // This actually tests p15; the following is a declaration, not a definition.
  template<> 
  NonDefaultConstructible X0<NonDefaultConstructible>::member;
  
  template<> long X0<long>::member = 17;

  template<> float X0<float>::member;
  
  template<> double X0<double>::member;
}

NonDefaultConstructible &get_static_member() {
  return N0::X0<NonDefaultConstructible>::member;
}

template<> int N0::X0<int>::member;

template<> float N0::X0<float>::member = 3.14f;

namespace N1 {
  template<> double N0::X0<double>::member = 3.14; // expected-error{{does not enclose namespace}}
}

//    -- member class of a class template
namespace N0 {
  
  template<>
  struct X0<void*>::Inner { };

  template<>
  struct X0<int>::Inner { };

  template<>
  struct X0<unsigned>::Inner;

  template<>
  struct X0<float>::Inner;

  template<>
  struct X0<double>::Inner; // expected-note{{forward declaration}}
}

template<>
struct N0::X0<long>::Inner { };

template<>
struct N0::X0<float>::Inner { };

namespace N1 {
  template<>
  struct N0::X0<unsigned>::Inner { }; // expected-error{{member class specialization}}

  template<>
  struct N0::X0<unsigned long>::Inner { }; // expected-error{{member class specialization}}
};

N0::X0<void*>::Inner inner0;
N0::X0<int>::Inner inner1;
N0::X0<long>::Inner inner2;
N0::X0<float>::Inner inner3;
N0::X0<double>::Inner inner4; // expected-error{{incomplete}}

//    -- member class template of a class template
namespace N0 {
  template<>
  template<>
  struct X0<void*>::InnerTemplate<int> { };
  
  template<> template<>
  struct X0<int>::InnerTemplate<int>; // expected-note{{forward declaration}}

  template<> template<>
  struct X0<int>::InnerTemplate<long>;

  template<> template<>
  struct X0<int>::InnerTemplate<double>;
}

template<> template<>
struct N0::X0<int>::InnerTemplate<long> { }; // okay

template<> template<>
struct N0::X0<int>::InnerTemplate<float> { };

namespace N1 {
  template<> template<>
  struct N0::X0<int>::InnerTemplate<double> { }; // expected-error{{enclosing}}
}

N0::X0<void*>::InnerTemplate<int> inner_template0;
N0::X0<int>::InnerTemplate<int> inner_template1; // expected-error{{incomplete}}
N0::X0<int>::InnerTemplate<long> inner_template2;
N0::X0<int>::InnerTemplate<unsigned long> inner_template3; // expected-note{{instantiation}}

//    -- member function template of a class template
namespace N0 {
  template<>
  template<>
  void X0<void*>::ft1(void*, const void*) { }
  
  template<> template<>
  void X0<void*>::ft1(void *, int);

  template<> template<>
  void X0<void*>::ft1(void *, unsigned);

  template<> template<>
  void X0<void*>::ft1(void *, long);
}

template<> template<>
void N0::X0<void*>::ft1(void *, unsigned) { } // okay

template<> template<>
void N0::X0<void*>::ft1(void *, float) { }

namespace N1 {
  template<> template<>
  void N0::X0<void*>::ft1(void *, long) { } // expected-error{{does not enclose namespace}}
}


void test_func_template(N0::X0<void *> xvp, void *vp, const void *cvp,
                        int i, unsigned u) {
  xvp.ft1(vp, cvp);
  xvp.ft1(vp, i);
  xvp.ft1(vp, u);
}

namespace has_inline_namespaces {
  inline namespace inner {
    template<class T> void f(T&);

    template<class T> 
    struct X0 {
      struct MemberClass;

      void mem_func();

      template<typename U>
      struct MemberClassTemplate;

      template<typename U>
      void mem_func_template(U&);

      static int value;
    };
  }

  struct X1;
  struct X2;

  // An explicit specialization whose declarator-id is not qualified
  // shall be declared in the nearest enclosing namespace of the
  // template, or, if the namespace is inline (7.3.1), any namespace
  // from its enclosing namespace set.
  template<> void f(X1&);
  template<> void f<X2>(X2&);

  template<> struct X0<X1> { };

  template<> struct X0<X2>::MemberClass { };

  template<> void X0<X2>::mem_func();

  template<> template<typename T> struct X0<X2>::MemberClassTemplate { };

  template<> template<typename T> void X0<X2>::mem_func_template(T&) { }

  template<> int X0<X2>::value = 12;
}

struct X3;
struct X4;

template<> void has_inline_namespaces::f(X3&);
template<> void has_inline_namespaces::f<X4>(X4&);

template<> struct has_inline_namespaces::X0<X3> { };

template<> struct has_inline_namespaces::X0<X4>::MemberClass { };

template<> void has_inline_namespaces::X0<X4>::mem_func();

template<> template<typename T> 
struct has_inline_namespaces::X0<X4>::MemberClassTemplate { };

template<> template<typename T> 
void has_inline_namespaces::X0<X4>::mem_func_template(T&) { }

template<> int has_inline_namespaces::X0<X4>::value = 13;

namespace PR12938 {
  template<typename> [[noreturn]] void func();
  template<> void func<int>();
}
