From 222e2a7620e6520ffaf4fc4e69d79c18da31542e Mon Sep 17 00:00:00 2001 From: "Zancanaro; Carlo" Date: Mon, 24 Sep 2012 09:58:17 +1000 Subject: Add the clang library to the repo (with some of my changes, too). --- .../CXX/temp/temp.spec/temp.expl.spec/examples.cpp | 334 +++++++++++++++++++++ 1 file changed, 334 insertions(+) create mode 100644 clang/test/CXX/temp/temp.spec/temp.expl.spec/examples.cpp (limited to 'clang/test/CXX/temp/temp.spec/temp.expl.spec/examples.cpp') diff --git a/clang/test/CXX/temp/temp.spec/temp.expl.spec/examples.cpp b/clang/test/CXX/temp/temp.spec/temp.expl.spec/examples.cpp new file mode 100644 index 0000000..aecbfb5 --- /dev/null +++ b/clang/test/CXX/temp/temp.spec/temp.expl.spec/examples.cpp @@ -0,0 +1,334 @@ +// 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 { }; + template class 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')}} + } + + 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 { }; + template class BasicStringPiece; + } + + // 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 { }; + template class 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')}} + } + + 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 'spec_vs_expl_inst::IDS_WithDefinedTemplate::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 { }; + template class BasicStringPiece; // expected-note {{previous explicit instantiation is here}} + template class BasicStringPiece; // expected-error {{duplicate explicit instantiation of 'BasicStringPiece'}} + } + + namespace SIS { + template class BasicStringPiece; + template <> class BasicStringPiece { }; // expected-note {{previous definition is here}} + template class BasicStringPiece; + template <> class BasicStringPiece { }; // expected-error {{redefinition of 'spec_vs_expl_inst::SIS::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 'spec_vs_expl_inst::SDS::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 'spec_vs_expl_inst::SDIS::BasicStringPiece'}} + } + +} -- cgit v1.2.3