From 50b73317314e889cf39c7b1d6cbf419fa7502f22 Mon Sep 17 00:00:00 2001 From: dim Date: Sat, 14 Apr 2012 14:01:31 +0000 Subject: Vendor import of clang trunk r154661: http://llvm.org/svn/llvm-project/cfe/trunk@r154661 --- .../CXX/temp/temp.spec/temp.expl.spec/examples.cpp | 125 +++++++++++++++++++++ 1 file changed, 125 insertions(+) (limited to 'test/CXX/temp/temp.spec/temp.expl.spec/examples.cpp') diff --git a/test/CXX/temp/temp.spec/temp.expl.spec/examples.cpp b/test/CXX/temp/temp.spec/temp.expl.spec/examples.cpp index f04c544..aecbfb5 100644 --- a/test/CXX/temp/temp.spec/temp.expl.spec/examples.cpp +++ b/test/CXX/temp/temp.spec/temp.expl.spec/examples.cpp @@ -207,3 +207,128 @@ namespace template_class_spec_perClassDecl_nested 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.1