diff options
Diffstat (limited to 'clang/lib/Sema/SemaTemplate.cpp')
-rw-r--r-- | clang/lib/Sema/SemaTemplate.cpp | 52 |
1 files changed, 20 insertions, 32 deletions
diff --git a/clang/lib/Sema/SemaTemplate.cpp b/clang/lib/Sema/SemaTemplate.cpp index 9c7126d9266..10103708384 100644 --- a/clang/lib/Sema/SemaTemplate.cpp +++ b/clang/lib/Sema/SemaTemplate.cpp @@ -8619,29 +8619,6 @@ static bool CheckExplicitInstantiationScope(Sema &S, NamedDecl *D, return false; } -/// Common checks for whether an explicit instantiation of \p D is valid. -static bool CheckExplicitInstantiation(Sema &S, NamedDecl *D, - SourceLocation InstLoc, - bool WasQualifiedName, - TemplateSpecializationKind TSK) { - // C++ [temp.explicit]p13: - // An explicit instantiation declaration shall not name a specialization of - // a template with internal linkage. - if (TSK == TSK_ExplicitInstantiationDeclaration && - D->getFormalLinkage() == InternalLinkage) { - S.Diag(InstLoc, diag::err_explicit_instantiation_internal_linkage) << D; - return true; - } - - // C++11 [temp.explicit]p3: [DR 275] - // An explicit instantiation shall appear in an enclosing namespace of its - // template. - if (CheckExplicitInstantiationScope(S, D, InstLoc, WasQualifiedName)) - return true; - - return false; -} - /// Determine whether the given scope specifier has a template-id in it. static bool ScopeSpecifierHasTemplateId(const CXXScopeSpec &SS) { if (!SS.isSet()) @@ -8793,8 +8770,13 @@ DeclResult Sema::ActOnExplicitInstantiation( TemplateSpecializationKind PrevDecl_TSK = PrevDecl ? PrevDecl->getTemplateSpecializationKind() : TSK_Undeclared; - if (CheckExplicitInstantiation(*this, ClassTemplate, TemplateNameLoc, - SS.isSet(), TSK)) + // C++0x [temp.explicit]p2: + // [...] An explicit instantiation shall appear in an enclosing + // namespace of its template. [...] + // + // This is C++ DR 275. + if (CheckExplicitInstantiationScope(*this, ClassTemplate, TemplateNameLoc, + SS.isSet())) return true; ClassTemplateSpecializationDecl *Specialization = nullptr; @@ -9017,7 +8999,12 @@ Sema::ActOnExplicitInstantiation(Scope *S, SourceLocation ExternLoc, = ExternLoc.isInvalid()? TSK_ExplicitInstantiationDefinition : TSK_ExplicitInstantiationDeclaration; - CheckExplicitInstantiation(*this, Record, NameLoc, true, TSK); + // C++0x [temp.explicit]p2: + // [...] An explicit instantiation shall appear in an enclosing + // namespace of its template. [...] + // + // This is C++ DR 275. + CheckExplicitInstantiationScope(*this, Record, NameLoc, true); // Verify that it is okay to explicitly instantiate here. CXXRecordDecl *PrevDecl @@ -9248,7 +9235,8 @@ DeclResult Sema::ActOnExplicitInstantiation(Scope *S, diag::ext_explicit_instantiation_without_qualified_id) << Prev << D.getCXXScopeSpec().getRange(); - CheckExplicitInstantiation(*this, Prev, D.getIdentifierLoc(), true, TSK); + // Check the scope of this explicit instantiation. + CheckExplicitInstantiationScope(*this, Prev, D.getIdentifierLoc(), true); // Verify that it is okay to explicitly instantiate here. TemplateSpecializationKind PrevTSK = Prev->getTemplateSpecializationKind(); @@ -9456,11 +9444,11 @@ DeclResult Sema::ActOnExplicitInstantiation(Scope *S, diag::ext_explicit_instantiation_without_qualified_id) << Specialization << D.getCXXScopeSpec().getRange(); - CheckExplicitInstantiation( - *this, - FunTmpl ? (NamedDecl *)FunTmpl - : Specialization->getInstantiatedFromMemberFunction(), - D.getIdentifierLoc(), D.getCXXScopeSpec().isSet(), TSK); + CheckExplicitInstantiationScope(*this, + FunTmpl? (NamedDecl *)FunTmpl + : Specialization->getInstantiatedFromMemberFunction(), + D.getIdentifierLoc(), + D.getCXXScopeSpec().isSet()); // FIXME: Create some kind of ExplicitInstantiationDecl here. return (Decl*) nullptr; |