// RUN: %clang_cc1 -fsyntax-only -verify %s namespace PR5907 { template struct identity { typedef T type; }; struct A { A(); }; identity::type::A() { } struct B { void f(); }; template struct C { typedef B type; }; void C::type::f() { } } namespace PR9421 { namespace N { template struct S { void f(); }; } typedef N::S T; namespace N { template<> void T::f() {} } } namespace PR8277 { template< typename S > struct C { template< int > void F( void ) { } }; template< typename S > struct D { typedef C< int > A; }; typedef D< int >::A A; template<> template<> void A::F< 0 >( void ) { } } namespace PR8277b { template struct C { void f(); }; template struct D { typedef C A; }; template<> void D::A::f() { } } namespace PR8708 { template struct A { template struct B { // #2 void f(); }; }; // #A specialize the member template for // implicit instantiation of A, // leaving the member template "unspecialized" // (14.7.3/16). Specialization uses the syntax // for explicit specialization (14.7.3/14) template<> template struct A::B { // #1 void g(); }; // #1 define its function g. There is an enclosing // class template, so we write template<> for each // specialized template (14.7.3/15). template<> template void A::B::g() { } // #2 define the unspecialized member template's // f template template void A::B::f() { } // specialize the member template again, now // specializing the member too. This specializes // #A template<> template<> struct A::B { // #3 void h(); }; // defines #3. There is no enclosing class template, so // we write no "template<>". void A::B::h() { } void test() { // calls #1 A::B a; a.g(); // calls #2 A::B b; b.f(); // calls #3 A::B c; c.h(); } } namespace PR9482 { namespace N1 { template struct S { void foo() {} }; } namespace N2 { typedef N1::S X; } namespace N1 { template<> void N2::X::foo() {} } } namespace PR9668 { namespace First { template class Bar { protected: static const bool static_bool; }; } namespace Second { class Foo; } typedef First::Bar Special; namespace First { template<> const bool Special::static_bool(false); } } namespace PR9877 { template struct X { struct Y; }; template<> struct X<0>::Y { static const int Z = 1; }; template<> struct X<1>::Y { static const int Z = 1; }; const int X<0>::Y::Z; template<> const int X<1>::Y::Z; // expected-error{{extraneous 'template<>' in declaration of variable 'Z'}} } namespace PR9913 { templatestruct S; templatestruct S { template class F; }; template template class S::F{}; } namespace template_class_spec_perClassDecl_nested { template struct A { template struct B { template struct C { static void foo(); }; }; }; template <> struct A { template struct B { template struct C { static void foo(); }; }; }; template <> template struct A::B::C { static void foo(); }; template <> template <> struct A::B::C { static void foo(); }; template <> template<> template struct A::B::C { static void foo(); }; } namespace spec_vs_expl_inst { // Test all permutations of Specialization, // explicit instantiation Declaration, and explicit instantiation defInition. namespace SDI { // PR11558 template class BasicStringPiece; template <> class BasicStringPiece { }; extern template class BasicStringPiece; template class BasicStringPiece; } namespace SID { template class BasicStringPiece; template <> class BasicStringPiece { }; // expected-note {{previous template specialization is here}} template class BasicStringPiece; // expected-note {{explicit instantiation definition is here}} expected-warning {{has no effect}} extern template class BasicStringPiece; // expected-error {{explicit instantiation declaration (with 'extern') follows explicit instantiation definition (without 'extern')}} } namespace ISD { template class BasicStringPiece; // expected-note {{template is declared here}} template class BasicStringPiece; // expected-error {{explicit instantiation of undefined template 'spec_vs_expl_inst::ISD::BasicStringPiece'}} template <> class BasicStringPiece { }; extern template class BasicStringPiece; } namespace IDS { template class BasicStringPiece; // expected-note {{template is declared here}} template class BasicStringPiece; // expected-error {{explicit instantiation of undefined template 'spec_vs_expl_inst::IDS::BasicStringPiece'}} // expected-note {{explicit instantiation definition is here}} extern template class BasicStringPiece; // expected-error {{explicit instantiation declaration (with 'extern') follows explicit instantiation definition (without 'extern')}} template <> class BasicStringPiece { }; } namespace DIS { template class BasicStringPiece; // expected-note {{template is declared here}} extern template class BasicStringPiece; // expected-error {{explicit instantiation of undefined template 'spec_vs_expl_inst::DIS::BasicStringPiece'}} template class BasicStringPiece; template <> class BasicStringPiece { }; } namespace DSI { template class BasicStringPiece; // expected-note {{template is declared here}} extern template class BasicStringPiece; // expected-error {{explicit instantiation of undefined template 'spec_vs_expl_inst::DSI::BasicStringPiece'}} template <> class BasicStringPiece { }; // expected-note {{previous}} template class BasicStringPiece; // expected-warning {{has no effect}} } // The same again, with a defined template class. namespace SDI_WithDefinedTemplate { template class BasicStringPiece {}; template <> class BasicStringPiece { }; extern template class BasicStringPiece; template class BasicStringPiece; } namespace SID_WithDefinedTemplate { template class BasicStringPiece {}; template <> class BasicStringPiece { }; // expected-note {{previous}} template class BasicStringPiece; // expected-note {{explicit instantiation definition is here}} expected-warning {{has no effect}} extern template class BasicStringPiece; // expected-error {{explicit instantiation declaration (with 'extern') follows explicit instantiation definition (without 'extern')}} } namespace ISD_WithDefinedTemplate { template class BasicStringPiece {}; template class BasicStringPiece; // expected-note {{explicit instantiation first required here}} template <> class BasicStringPiece { }; // expected-error {{explicit specialization of 'spec_vs_expl_inst::ISD_WithDefinedTemplate::BasicStringPiece' after instantiation}} extern template class BasicStringPiece; } namespace IDS_WithDefinedTemplate { template class BasicStringPiece {}; template class BasicStringPiece; // expected-note {{explicit instantiation definition is here}} expected-note {{previous definition is here}} extern template class BasicStringPiece; // expected-error {{explicit instantiation declaration (with 'extern') follows explicit instantiation definition (without 'extern')}} template <> class BasicStringPiece { }; // expected-error {{redefinition of 'BasicStringPiece'}} } namespace DIS_WithDefinedTemplate { template class BasicStringPiece {}; extern template class BasicStringPiece; // expected-note {{explicit instantiation first required here}} template class BasicStringPiece; template <> class BasicStringPiece { }; // expected-error {{explicit specialization of 'spec_vs_expl_inst::DIS_WithDefinedTemplate::BasicStringPiece' after instantiation}} } namespace DSI_WithDefinedTemplate { template class BasicStringPiece {}; extern template class BasicStringPiece; // expected-note {{explicit instantiation first required here}} template <> class BasicStringPiece { }; // expected-error {{explicit specialization of 'spec_vs_expl_inst::DSI_WithDefinedTemplate::BasicStringPiece' after instantiation}} template class BasicStringPiece; } // And some more random tests. namespace SII_WithDefinedTemplate { template class BasicStringPiece {}; template <> class BasicStringPiece { }; // expected-note {{previous}} template class BasicStringPiece; // expected-note {{previous explicit instantiation is here}} expected-warning {{has no effect}} template class BasicStringPiece; // expected-error {{duplicate explicit instantiation of 'BasicStringPiece'}} } namespace SIS { template class BasicStringPiece; template <> class BasicStringPiece { }; // expected-note {{previous definition is here}} expected-note {{previous}} template class BasicStringPiece; // expected-warning {{has no effect}} template <> class BasicStringPiece { }; // expected-error {{redefinition of 'BasicStringPiece'}} } namespace SDS { template class BasicStringPiece; template <> class BasicStringPiece { }; // expected-note {{previous definition is here}} extern template class BasicStringPiece; template <> class BasicStringPiece { }; // expected-error {{redefinition of 'BasicStringPiece'}} } namespace SDIS { template class BasicStringPiece; template <> class BasicStringPiece { }; // expected-note {{previous definition is here}} extern template class BasicStringPiece; template class BasicStringPiece; template <> class BasicStringPiece { }; // expected-error {{redefinition of 'BasicStringPiece'}} } }