Skip to content

Commit c6855ab

Browse files
committed
Revert "[Clang] Unify interface for accessing template arguments as written for class/variable template specializations (llvm#81642)"
This reverts commit 7115ed0. This commit broke several LLDB tests. https://green.lab.llvm.org/job/llvm.org/view/LLDB/job/as-lldb-cmake/3480/
1 parent 2e4abfa commit c6855ab

26 files changed

+729
-846
lines changed

clang-tools-extra/clangd/AST.cpp

Lines changed: 26 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -50,12 +50,17 @@ getTemplateSpecializationArgLocs(const NamedDecl &ND) {
5050
if (const ASTTemplateArgumentListInfo *Args =
5151
Func->getTemplateSpecializationArgsAsWritten())
5252
return Args->arguments();
53-
} else if (auto *Cls = llvm::dyn_cast<ClassTemplateSpecializationDecl>(&ND)) {
53+
} else if (auto *Cls =
54+
llvm::dyn_cast<ClassTemplatePartialSpecializationDecl>(&ND)) {
5455
if (auto *Args = Cls->getTemplateArgsAsWritten())
5556
return Args->arguments();
56-
} else if (auto *Var = llvm::dyn_cast<VarTemplateSpecializationDecl>(&ND)) {
57+
} else if (auto *Var =
58+
llvm::dyn_cast<VarTemplatePartialSpecializationDecl>(&ND)) {
5759
if (auto *Args = Var->getTemplateArgsAsWritten())
5860
return Args->arguments();
61+
} else if (auto *Var = llvm::dyn_cast<VarTemplateSpecializationDecl>(&ND)) {
62+
if (auto *Args = Var->getTemplateArgsInfo())
63+
return Args->arguments();
5964
}
6065
// We return std::nullopt for ClassTemplateSpecializationDecls because it does
6166
// not contain TemplateArgumentLoc information.
@@ -265,10 +270,22 @@ std::string printTemplateSpecializationArgs(const NamedDecl &ND) {
265270
getTemplateSpecializationArgLocs(ND)) {
266271
printTemplateArgumentList(OS, *Args, Policy);
267272
} else if (auto *Cls = llvm::dyn_cast<ClassTemplateSpecializationDecl>(&ND)) {
268-
// FIXME: Fix cases when getTypeAsWritten returns null inside clang AST,
269-
// e.g. friend decls. Currently we fallback to Template Arguments without
270-
// location information.
271-
printTemplateArgumentList(OS, Cls->getTemplateArgs().asArray(), Policy);
273+
if (const TypeSourceInfo *TSI = Cls->getTypeAsWritten()) {
274+
// ClassTemplateSpecializationDecls do not contain
275+
// TemplateArgumentTypeLocs, they only have TemplateArgumentTypes. So we
276+
// create a new argument location list from TypeSourceInfo.
277+
auto STL = TSI->getTypeLoc().getAs<TemplateSpecializationTypeLoc>();
278+
llvm::SmallVector<TemplateArgumentLoc> ArgLocs;
279+
ArgLocs.reserve(STL.getNumArgs());
280+
for (unsigned I = 0; I < STL.getNumArgs(); ++I)
281+
ArgLocs.push_back(STL.getArgLoc(I));
282+
printTemplateArgumentList(OS, ArgLocs, Policy);
283+
} else {
284+
// FIXME: Fix cases when getTypeAsWritten returns null inside clang AST,
285+
// e.g. friend decls. Currently we fallback to Template Arguments without
286+
// location information.
287+
printTemplateArgumentList(OS, Cls->getTemplateArgs().asArray(), Policy);
288+
}
272289
}
273290
OS.flush();
274291
return TemplateArgs;
@@ -436,12 +453,10 @@ bool hasReservedScope(const DeclContext &DC) {
436453
}
437454

438455
QualType declaredType(const TypeDecl *D) {
439-
ASTContext &Context = D->getASTContext();
440456
if (const auto *CTSD = llvm::dyn_cast<ClassTemplateSpecializationDecl>(D))
441-
if (const auto *Args = CTSD->getTemplateArgsAsWritten())
442-
return Context.getTemplateSpecializationType(
443-
TemplateName(CTSD->getSpecializedTemplate()), Args->arguments());
444-
return Context.getTypeDeclType(D);
457+
if (const auto *TSI = CTSD->getTypeAsWritten())
458+
return TSI->getType();
459+
return D->getASTContext().getTypeDeclType(D);
445460
}
446461

447462
namespace {

clang-tools-extra/clangd/SemanticHighlighting.cpp

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -693,22 +693,17 @@ class CollectExtraHighlightings
693693
return true;
694694
}
695695

696-
bool
697-
VisitClassTemplateSpecializationDecl(ClassTemplateSpecializationDecl *D) {
698-
if (auto *Args = D->getTemplateArgsAsWritten())
699-
H.addAngleBracketTokens(Args->getLAngleLoc(), Args->getRAngleLoc());
700-
return true;
701-
}
702-
703696
bool VisitClassTemplatePartialSpecializationDecl(
704697
ClassTemplatePartialSpecializationDecl *D) {
705698
if (auto *TPL = D->getTemplateParameters())
706699
H.addAngleBracketTokens(TPL->getLAngleLoc(), TPL->getRAngleLoc());
700+
if (auto *Args = D->getTemplateArgsAsWritten())
701+
H.addAngleBracketTokens(Args->getLAngleLoc(), Args->getRAngleLoc());
707702
return true;
708703
}
709704

710705
bool VisitVarTemplateSpecializationDecl(VarTemplateSpecializationDecl *D) {
711-
if (auto *Args = D->getTemplateArgsAsWritten())
706+
if (auto *Args = D->getTemplateArgsInfo())
712707
H.addAngleBracketTokens(Args->getLAngleLoc(), Args->getRAngleLoc());
713708
return true;
714709
}
@@ -717,6 +712,8 @@ class CollectExtraHighlightings
717712
VarTemplatePartialSpecializationDecl *D) {
718713
if (auto *TPL = D->getTemplateParameters())
719714
H.addAngleBracketTokens(TPL->getLAngleLoc(), TPL->getRAngleLoc());
715+
if (auto *Args = D->getTemplateArgsAsWritten())
716+
H.addAngleBracketTokens(Args->getLAngleLoc(), Args->getRAngleLoc());
720717
return true;
721718
}
722719

clang-tools-extra/include-cleaner/lib/WalkAST.cpp

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -267,21 +267,18 @@ class ASTWalker : public RecursiveASTVisitor<ASTWalker> {
267267
return true;
268268
}
269269

270-
// Report a reference from explicit specializations/instantiations to the
271-
// specialized template. Implicit ones are filtered out by RAV.
270+
// Report a reference from explicit specializations to the specialized
271+
// template. Implicit ones are filtered out by RAV and explicit instantiations
272+
// are already traversed through typelocs.
272273
bool
273274
VisitClassTemplateSpecializationDecl(ClassTemplateSpecializationDecl *CTSD) {
274-
// if (CTSD->isExplicitSpecialization())
275-
if (clang::isTemplateExplicitInstantiationOrSpecialization(
276-
CTSD->getTemplateSpecializationKind()))
275+
if (CTSD->isExplicitSpecialization())
277276
report(CTSD->getLocation(),
278277
CTSD->getSpecializedTemplate()->getTemplatedDecl());
279278
return true;
280279
}
281280
bool VisitVarTemplateSpecializationDecl(VarTemplateSpecializationDecl *VTSD) {
282-
// if (VTSD->isExplicitSpecialization())
283-
if (clang::isTemplateExplicitInstantiationOrSpecialization(
284-
VTSD->getTemplateSpecializationKind()))
281+
if (VTSD->isExplicitSpecialization())
285282
report(VTSD->getLocation(),
286283
VTSD->getSpecializedTemplate()->getTemplatedDecl());
287284
return true;

0 commit comments

Comments
 (0)