// RUN: %clang_cc1 -fsyntax-only -pedantic-errors -verify %s template struct A { void f(T); template void g1(T, X1); template void g2(T, X2); void h(T) { } }; // specialization template<> void A::f(int); // out of class member template definition template template void A::g1(T, X1) { } // member template specialization template<> template void A::g1(int, X1); // member template specialization template<> template<> void A::g1(int, char); // X1 deduced as char template<> template<> void A::g2(int, char); // X2 specified as char // member specialization even if defined in class definition template<> void A::h(int) { } namespace PR10024 { template struct Test{ template void get(U i) {} }; template template <> void Test::get(double i) {} // expected-error{{cannot specialize (with 'template<>') a member of an unspecialized template}} } namespace extraneous { template struct A; template int x; template void f(); template<> // expected-error{{extraneous template parameter list in template specialization}} template<> struct A; template<> // expected-error{{extraneous template parameter list in template specialization}} template<> int x; template<> // expected-error{{extraneous template parameter list in template specialization}} template<> void f(); template struct B { struct C; template struct D; static int y; template static int z; void g(); template void h(); enum class E; enum F : int; }; template<> template<> // expected-error{{extraneous 'template<>' in declaration of struct 'C'}} struct B::C; template<> template<> // expected-error{{extraneous template parameter list in template specialization}} template<> struct B::D; template<> template<> // expected-error{{extraneous template parameter list in template specialization}} template struct B::D; template<> template<> // expected-error{{extraneous 'template<>' in declaration of variable 'y'}} int B::y; template<> template<> // expected-error{{extraneous template parameter list in template specialization}} template<> int B::z; template<> template<> // expected-error{{extraneous template parameter list in template specialization}} template int B::z; template<> template<> void B::g(); // expected-error{{no function template matches function template specialization 'g'}} template<> template<> // expected-error{{extraneous template parameter list in template specialization}} template<> void B::h(); template<> template<> // expected-error{{extraneous template parameter list in template specialization}} template void B::h(); // expected-error{{function template partial specialization is not allowed}} // FIXME: We should diagnose this as having an extraneous 'template<>' template<> template<> enum class B::E; // expected-error{{enumeration cannot be a template}} // FIXME: We should diagnose this as having an extraneous 'template<>' template<> template<> enum B::F : int; // expected-error{{enumeration cannot be a template}} }