Skip to content

Commit 0185834

Browse files
committed
[FOLD] only call setTemplateKeywordLoc for explicit instantiations
1 parent 9259c11 commit 0185834

File tree

3 files changed

+42
-45
lines changed

3 files changed

+42
-45
lines changed

clang/lib/AST/ASTImporter.cpp

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -443,8 +443,10 @@ namespace clang {
443443
Expected<FunctionTemplateAndArgsTy>
444444
ImportFunctionTemplateWithTemplateArgsFromSpecialization(
445445
FunctionDecl *FromFD);
446-
Error ImportTemplateParameterLists(const DeclaratorDecl *FromD,
447-
DeclaratorDecl *ToD);
446+
447+
template <typename DeclTy>
448+
Error ImportTemplateParameterLists(const DeclTy *FromD,
449+
DeclTy *ToD);
448450

449451
Error ImportTemplateInformation(FunctionDecl *FromFD, FunctionDecl *ToFD);
450452

@@ -3313,8 +3315,9 @@ ExpectedDecl ASTNodeImporter::VisitEnumConstantDecl(EnumConstantDecl *D) {
33133315
return ToEnumerator;
33143316
}
33153317

3316-
Error ASTNodeImporter::ImportTemplateParameterLists(const DeclaratorDecl *FromD,
3317-
DeclaratorDecl *ToD) {
3318+
template <typename DeclTy>
3319+
Error ASTNodeImporter::ImportTemplateParameterLists(const DeclTy *FromD,
3320+
DeclTy *ToD) {
33183321
unsigned int Num = FromD->getNumTemplateParameterLists();
33193322
if (Num == 0)
33203323
return Error::success();
@@ -6237,6 +6240,9 @@ ExpectedDecl ASTNodeImporter::VisitClassTemplateSpecializationDecl(
62376240
else
62386241
return BraceRangeOrErr.takeError();
62396242

6243+
if (Error Err = ImportTemplateParameterLists(D, D2))
6244+
return std::move(Err);
6245+
62406246
// Import the qualifier, if any.
62416247
if (auto LocOrErr = import(D->getQualifierLoc()))
62426248
D2->setQualifierInfo(*LocOrErr);

clang/lib/AST/DeclTemplate.cpp

Lines changed: 27 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -986,47 +986,33 @@ ClassTemplateSpecializationDecl::getSpecializedTemplate() const {
986986

987987
SourceRange
988988
ClassTemplateSpecializationDecl::getSourceRange() const {
989-
using CTPSDecl = ClassTemplatePartialSpecializationDecl;
990-
if (ExplicitInfo) {
991-
SourceLocation Begin = getTemplateKeywordLoc();
992-
if (Begin.isInvalid()) {
993-
if (getNumTemplateParameterLists())
994-
Begin = getTemplateParameterList(0)->getTemplateLoc();
995-
else if (const auto *CTPSD = dyn_cast<CTPSDecl>(this))
996-
Begin = CTPSD->getTemplateParameters()->getTemplateLoc();
997-
}
998-
if (Begin.isValid()) {
999-
// Here we have an explicit (partial) specialization or instantiation.
1000-
assert(getSpecializationKind() == TSK_ExplicitSpecialization ||
1001-
getSpecializationKind() == TSK_ExplicitInstantiationDeclaration ||
1002-
getSpecializationKind() == TSK_ExplicitInstantiationDefinition);
1003-
if (getExternLoc().isValid())
1004-
Begin = getExternLoc();
1005-
SourceLocation End = getBraceRange().getEnd();
1006-
if (End.isInvalid())
1007-
End = getTemplateArgsAsWritten()->getRAngleLoc();
1008-
return SourceRange(Begin, End);
1009-
}
1010-
// An implicit instantiation of a class template partial specialization
1011-
// uses ExplicitInfo to record the TypeAsWritten, but the source
1012-
// locations should be retrieved from the instantiation pattern.
1013-
auto *ctpsd = const_cast<CTPSDecl *>(cast<CTPSDecl>(this));
1014-
CTPSDecl *inst_from = ctpsd->getInstantiatedFromMember();
1015-
assert(inst_from != nullptr);
1016-
return inst_from->getSourceRange();
1017-
}
1018-
else {
989+
if (getSpecializationKind() == TSK_ExplicitInstantiationDeclaration) {
990+
return SourceRange(getExternLoc(), getTemplateArgsAsWritten()->getRAngleLoc());
991+
} else if (getSpecializationKind() == TSK_ExplicitInstantiationDefinition) {
992+
return SourceRange(getTemplateKeywordLoc(), getTemplateArgsAsWritten()->getRAngleLoc());
993+
} else if (!isExplicitSpecialization()) {
1019994
// No explicit info available.
1020995
llvm::PointerUnion<ClassTemplateDecl *,
1021996
ClassTemplatePartialSpecializationDecl *>
1022-
inst_from = getInstantiatedFrom();
1023-
if (inst_from.isNull())
997+
InstFrom = getInstantiatedFrom();
998+
if (InstFrom.isNull())
1024999
return getSpecializedTemplate()->getSourceRange();
1025-
if (const auto *ctd = inst_from.dyn_cast<ClassTemplateDecl *>())
1026-
return ctd->getSourceRange();
1027-
return inst_from.get<ClassTemplatePartialSpecializationDecl *>()
1000+
if (const auto *CTD = InstFrom.dyn_cast<ClassTemplateDecl *>())
1001+
return CTD->getSourceRange();
1002+
return InstFrom.get<ClassTemplatePartialSpecializationDecl *>()
10281003
->getSourceRange();
10291004
}
1005+
SourceLocation Begin = TagDecl::getOuterLocStart();
1006+
if (const auto *CTPSD = dyn_cast<ClassTemplatePartialSpecializationDecl>(this)) {
1007+
if (const auto *InstFrom = CTPSD->getInstantiatedFromMember())
1008+
return InstFrom->getSourceRange();
1009+
else if (!getNumTemplateParameterLists())
1010+
Begin = CTPSD->getTemplateParameters()->getTemplateLoc();
1011+
}
1012+
SourceLocation End = getBraceRange().getEnd();
1013+
if (End.isInvalid())
1014+
End = getTemplateArgsAsWritten()->getRAngleLoc();
1015+
return SourceRange(Begin, End);
10301016
}
10311017

10321018
void ClassTemplateSpecializationDecl::setExternLoc(SourceLocation Loc) {
@@ -1395,6 +1381,12 @@ SourceRange VarTemplateSpecializationDecl::getSourceRange() const {
13951381
if (isExplicitSpecialization() && !hasInit()) {
13961382
if (const ASTTemplateArgumentListInfo *Info = getTemplateArgsAsWritten())
13971383
return SourceRange(getOuterLocStart(), Info->getRAngleLoc());
1384+
} else if (getTemplateSpecializationKind() == TSK_ExplicitInstantiationDeclaration ) {
1385+
if (const ASTTemplateArgumentListInfo *Info = getTemplateArgsAsWritten())
1386+
return SourceRange(getExternLoc(), Info->getRAngleLoc());
1387+
} else if (getTemplateSpecializationKind() == TSK_ExplicitInstantiationDefinition) {
1388+
if (const ASTTemplateArgumentListInfo *Info = getTemplateArgsAsWritten())
1389+
return SourceRange(getTemplateKeywordLoc(), Info->getRAngleLoc());
13981390
}
13991391
return VarDecl::getSourceRange();
14001392
}

clang/lib/Sema/SemaTemplate.cpp

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5120,7 +5120,6 @@ DeclResult Sema::ActOnVarTemplateSpecialization(
51205120
}
51215121
}
51225122

5123-
Specialization->setTemplateKeywordLoc(TemplateKWLoc);
51245123
Specialization->setLexicalDeclContext(CurContext);
51255124

51265125
// Add the specialization into its lexical context, so that it can
@@ -9479,11 +9478,6 @@ DeclResult Sema::ActOnClassTemplateSpecialization(
94799478
<< (isPartialSpecialization? 1 : 0)
94809479
<< FixItHint::CreateRemoval(ModulePrivateLoc);
94819480

9482-
if (TUK != TUK_Friend)
9483-
// FIXME: We really shouldn't be setting this unless this is an explicit
9484-
// instantiation. We already store the outer template parameter lists.
9485-
Specialization->setTemplateKeywordLoc(TemplateKWLoc);
9486-
94879481
// C++ [temp.expl.spec]p9:
94889482
// A template explicit specialization is in the scope of the
94899483
// namespace in which the template was defined.
@@ -11128,6 +11122,11 @@ DeclResult Sema::ActOnExplicitInstantiation(Scope *S,
1112811122
if (!HasNoEffect) {
1112911123
// Instantiate static data member or variable template.
1113011124
Prev->setTemplateSpecializationKind(TSK, D.getIdentifierLoc());
11125+
if (auto *VTSD = dyn_cast<VarTemplatePartialSpecializationDecl>(Prev)) {
11126+
VTSD->setExternLoc(ExternLoc);
11127+
VTSD->setTemplateKeywordLoc(TemplateLoc);
11128+
}
11129+
1113111130
// Merge attributes.
1113211131
ProcessDeclAttributeList(S, Prev, D.getDeclSpec().getAttributes());
1113311132
if (PrevTemplate)

0 commit comments

Comments
 (0)