// RUN: %clang_cc1 -fsyntax-only -verify %s template class A { template class B { void mf(); }; }; template<> template<> class A::B; template<> template<> void A::B::mf(); template<> void A::B::mf(); // expected-error{{requires 'template<>'}} namespace test1 { template class A { static int foo; static int bar; }; typedef A AA; template <> int AA::foo = 0; int AA::bar = 1; // expected-error {{template specialization requires 'template<>'}} int A::bar = 2; // expected-error {{template specialization requires 'template<>'}} template <> class A { public: static int foo; static int bar; }; typedef A AB; template <> int AB::foo = 0; // expected-error{{extraneous 'template<>'}} int AB::bar = 1; } namespace GH54151 { struct S { int i<0>; // expected-error {{member 'i' cannot have template arguments}} int j; // expected-error {{member 'j' cannot have template arguments}} static int k<12>; // expected-error {{template specialization requires 'template<>'}} \ expected-error{{no variable template matches specialization}} void f<12>(); // expected-error {{template specialization requires 'template<>'}} \ // expected-error {{no function template matches function template specialization 'f'}} }; template struct U { int i; // expected-error {{member 'i' cannot have template arguments}} int j; // expected-error {{member 'j' cannot have template arguments}} }; } // namespace GH54151