summaryrefslogtreecommitdiffstats
path: root/clang/lib/Sema/SemaTemplate.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'clang/lib/Sema/SemaTemplate.cpp')
-rw-r--r--clang/lib/Sema/SemaTemplate.cpp52
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;
OpenPOWER on IntegriCloud