[clang] [clang-tools-extra] [clang][NFC] Improve TemplateName traversal in RecursiveASTVisitor. (PR #218425)
via cfe-commits
cfe-commits at lists.llvm.org
Mon Aug 24 07:26:44 PDT 2026
llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-clangd
Author: Corentin Jabot (cor3ntin)
<details>
<summary>Changes</summary>
Use a `TraverseQualifier` bool like we do for type, instead of doing the decomposition ad-hoc in call sites.
This is (yet another PR) in preparation for P3670
Assisted-By: Opus 5
---
Full diff: https://github.com/llvm/llvm-project/pull/218425.diff
8 Files Affected:
- (modified) clang-tools-extra/clangd/DumpAST.cpp (+5-3)
- (modified) clang/include/clang/AST/DynamicRecursiveASTVisitor.h (+2-1)
- (modified) clang/include/clang/AST/RecursiveASTVisitor.h (+13-26)
- (modified) clang/lib/AST/DynamicRecursiveASTVisitor.cpp (+11-3)
- (modified) clang/lib/Sema/SemaConcept.cpp (+3-2)
- (modified) clang/lib/Sema/SemaTemplate.cpp (+3-2)
- (modified) clang/lib/Sema/SemaTemplateDeduction.cpp (+4-2)
- (modified) clang/lib/Sema/SemaTemplateVariadic.cpp (+4-2)
``````````diff
diff --git a/clang-tools-extra/clangd/DumpAST.cpp b/clang-tools-extra/clangd/DumpAST.cpp
index 2bcbbc09d90fe..c3c35c51cf1ea 100644
--- a/clang-tools-extra/clangd/DumpAST.cpp
+++ b/clang-tools-extra/clangd/DumpAST.cpp
@@ -346,9 +346,11 @@ class DumpVisitor : public RecursiveASTVisitor<DumpVisitor> {
Base::TraverseTypeLoc(TL, TraverseQualifier);
});
}
- bool TraverseTemplateName(const TemplateName &TN) {
- return TN.isNull() || traverseNode("template name", TN,
- [&] { Base::TraverseTemplateName(TN); });
+ bool TraverseTemplateName(const TemplateName &TN,
+ bool TraverseQualifier = true) {
+ return TN.isNull() || traverseNode("template name", TN, [&] {
+ Base::TraverseTemplateName(TN, TraverseQualifier);
+ });
}
bool TraverseTemplateArgumentLoc(const TemplateArgumentLoc &TAL) {
return traverseNode("template argument", TAL,
diff --git a/clang/include/clang/AST/DynamicRecursiveASTVisitor.h b/clang/include/clang/AST/DynamicRecursiveASTVisitor.h
index 67b87171719e8..78f443128e9ba 100644
--- a/clang/include/clang/AST/DynamicRecursiveASTVisitor.h
+++ b/clang/include/clang/AST/DynamicRecursiveASTVisitor.h
@@ -173,7 +173,8 @@ template <bool IsConst> class DynamicRecursiveASTVisitorBase {
/// appropriate method.
///
/// \returns false if the visitation was terminated early, true otherwise.
- virtual bool TraverseTemplateName(TemplateName Template);
+ virtual bool TraverseTemplateName(TemplateName Template,
+ bool TraverseQualifier = true);
/// Recursively visit a type, by dispatching to
/// Traverse*Type() based on the argument's getTypeClass() property.
diff --git a/clang/include/clang/AST/RecursiveASTVisitor.h b/clang/include/clang/AST/RecursiveASTVisitor.h
index 1f7c8d762e1b5..a933662f77273 100644
--- a/clang/include/clang/AST/RecursiveASTVisitor.h
+++ b/clang/include/clang/AST/RecursiveASTVisitor.h
@@ -259,7 +259,8 @@ template <typename Derived> class RecursiveASTVisitor {
/// appropriate method.
///
/// \returns false if the visitation was terminated early, true otherwise.
- bool TraverseTemplateName(TemplateName Template);
+ bool TraverseTemplateName(TemplateName Template,
+ bool TraverseQualifier = true);
/// Recursively visit a template argument and dispatch to the
/// appropriate method for the argument type.
@@ -871,12 +872,14 @@ bool RecursiveASTVisitor<Derived>::TraverseDeclarationNameInfo(
}
template <typename Derived>
-bool RecursiveASTVisitor<Derived>::TraverseTemplateName(TemplateName Template) {
+bool RecursiveASTVisitor<Derived>::TraverseTemplateName(
+ TemplateName Template, bool TraverseQualifier) {
if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) {
- TRY_TO(TraverseNestedNameSpecifier(DTN->getQualifier()));
+ if (TraverseQualifier)
+ TRY_TO(TraverseNestedNameSpecifier(DTN->getQualifier()));
} else if (QualifiedTemplateName *QTN =
Template.getAsQualifiedTemplateName()) {
- if (QTN->getQualifier()) {
+ if (TraverseQualifier && QTN->getQualifier()) {
TRY_TO(TraverseNestedNameSpecifier(QTN->getQualifier()));
}
}
@@ -1209,24 +1212,12 @@ DEF_TRAVERSE_TYPE(DependentNameType, {
})
DEF_TRAVERSE_TYPE(TemplateSpecializationType, {
- if (TraverseQualifier) {
- TRY_TO(TraverseTemplateName(T->getTemplateName()));
- } else {
- // FIXME: Try to preserve the rest of the template name.
- TRY_TO(TraverseTemplateName(TemplateName(
- T->getTemplateName().getAsTemplateDecl(/*IgnoreDeduced=*/true))));
- }
+ TRY_TO(TraverseTemplateName(T->getTemplateName(), TraverseQualifier));
TRY_TO(TraverseTemplateArguments(T->template_arguments()));
})
DEF_TRAVERSE_TYPE(DeducedTemplateSpecializationType, {
- if (TraverseQualifier) {
- TRY_TO(TraverseTemplateName(T->getTemplateName()));
- } else {
- // FIXME: Try to preserve the rest of the template name.
- TRY_TO(TraverseTemplateName(TemplateName(
- T->getTemplateName().getAsTemplateDecl(/*IgnoreDeduced=*/true))));
- }
+ TRY_TO(TraverseTemplateName(T->getTemplateName(), TraverseQualifier));
TRY_TO(TraverseType(T->getDeducedType()));
})
@@ -1565,10 +1556,8 @@ DEF_TRAVERSE_TYPELOC(TemplateSpecializationType, {
if (TraverseQualifier)
TRY_TO(TraverseNestedNameSpecifierLoc(TL.getQualifierLoc()));
- // FIXME: Try to preserve the rest of the template name.
- TRY_TO(TraverseTemplateName(
- TemplateName(TL.getTypePtr()->getTemplateName().getAsTemplateDecl(
- /*IgnoreDeduced=*/true))));
+ TRY_TO(TraverseTemplateName(TL.getTypePtr()->getTemplateName(),
+ /*TraverseQualifier=*/false));
for (unsigned I = 0, E = TL.getNumArgs(); I != E; ++I) {
TRY_TO(TraverseTemplateArgumentLoc(TL.getArgLoc(I)));
@@ -1580,10 +1569,8 @@ DEF_TRAVERSE_TYPELOC(DeducedTemplateSpecializationType, {
TRY_TO(TraverseNestedNameSpecifierLoc(TL.getQualifierLoc()));
const auto *T = TL.getTypePtr();
- // FIXME: Try to preserve the rest of the template name.
- TRY_TO(
- TraverseTemplateName(TemplateName(T->getTemplateName().getAsTemplateDecl(
- /*IgnoreDeduced=*/true))));
+ TRY_TO(TraverseTemplateName(T->getTemplateName(),
+ /*TraverseQualifier=*/false));
TRY_TO(TraverseType(T->getDeducedType()));
})
diff --git a/clang/lib/AST/DynamicRecursiveASTVisitor.cpp b/clang/lib/AST/DynamicRecursiveASTVisitor.cpp
index dde18aba4fcf7..4e802541d31bc 100644
--- a/clang/lib/AST/DynamicRecursiveASTVisitor.cpp
+++ b/clang/lib/AST/DynamicRecursiveASTVisitor.cpp
@@ -135,8 +135,9 @@ template <bool Const> struct Impl : RecursiveASTVisitor<Impl<Const>> {
return Visitor.TraverseTemplateArgumentLoc(ArgLoc);
}
- bool TraverseTemplateName(TemplateName Template) {
- return Visitor.TraverseTemplateName(Template);
+ bool TraverseTemplateName(TemplateName Template,
+ bool TraverseQualifier = true) {
+ return Visitor.TraverseTemplateName(Template, TraverseQualifier);
}
bool TraverseObjCProtocolLoc(ObjCProtocolLoc ProtocolLoc) {
@@ -325,9 +326,16 @@ FORWARD_TO_BASE_EXACT(TraverseDeclarationNameInfo, DeclarationNameInfo)
FORWARD_TO_BASE_EXACT(TraverseTemplateArgument, const TemplateArgument &)
FORWARD_TO_BASE_EXACT(TraverseTemplateArguments, ArrayRef<TemplateArgument>)
FORWARD_TO_BASE_EXACT(TraverseTemplateArgumentLoc, const TemplateArgumentLoc &)
-FORWARD_TO_BASE_EXACT(TraverseTemplateName, TemplateName)
FORWARD_TO_BASE_EXACT(TraverseNestedNameSpecifier, NestedNameSpecifier)
+template <bool Const>
+bool DynamicRecursiveASTVisitorBase<Const>::TraverseTemplateName(
+ TemplateName Template, bool TraverseQualifier) {
+ return Impl<Const>(*this)
+ .RecursiveASTVisitor<Impl<Const>>::TraverseTemplateName(
+ Template, TraverseQualifier);
+}
+
template <bool Const>
bool DynamicRecursiveASTVisitorBase<Const>::TraverseType(
QualType T, bool TraverseQualifier) {
diff --git a/clang/lib/Sema/SemaConcept.cpp b/clang/lib/Sema/SemaConcept.cpp
index 514df9c754482..def80e274e10c 100644
--- a/clang/lib/Sema/SemaConcept.cpp
+++ b/clang/lib/Sema/SemaConcept.cpp
@@ -475,7 +475,8 @@ class HashParameterMapping : public RecursiveASTVisitor<HashParameterMapping> {
return inherited::TraverseStmt(E->getReplacement());
}
- bool TraverseTemplateName(TemplateName Template) {
+ bool TraverseTemplateName(TemplateName Template,
+ bool TraverseQualifier = true) {
if (auto *TTP = dyn_cast_if_present<TemplateTemplateParmDecl>(
Template.getAsTemplateDecl());
TTP && TTP->getDepth() < TemplateArgs.getNumLevels()) {
@@ -494,7 +495,7 @@ class HashParameterMapping : public RecursiveASTVisitor<HashParameterMapping> {
UsedTemplateArgs.push_back(
SemaRef.Context.getCanonicalTemplateArgument(Arg));
}
- return inherited::TraverseTemplateName(Template);
+ return inherited::TraverseTemplateName(Template, TraverseQualifier);
}
void VisitConstraint(const NormalizedConstraintWithParamMapping &Constraint) {
diff --git a/clang/lib/Sema/SemaTemplate.cpp b/clang/lib/Sema/SemaTemplate.cpp
index 67289855685db..64a05a8bc34e3 100644
--- a/clang/lib/Sema/SemaTemplate.cpp
+++ b/clang/lib/Sema/SemaTemplate.cpp
@@ -2775,12 +2775,13 @@ struct DependencyChecker : DynamicRecursiveASTVisitor {
return IgnoreNonTypeDependent || !Matches(T->getDepth());
}
- bool TraverseTemplateName(TemplateName N) override {
+ bool TraverseTemplateName(TemplateName N, bool TraverseQualifier) override {
if (TemplateTemplateParmDecl *PD =
dyn_cast_or_null<TemplateTemplateParmDecl>(N.getAsTemplateDecl()))
if (Matches(PD->getDepth()))
return false;
- return DynamicRecursiveASTVisitor::TraverseTemplateName(N);
+ return DynamicRecursiveASTVisitor::TraverseTemplateName(N,
+ TraverseQualifier);
}
bool VisitDeclRefExpr(DeclRefExpr *E) override {
diff --git a/clang/lib/Sema/SemaTemplateDeduction.cpp b/clang/lib/Sema/SemaTemplateDeduction.cpp
index 54edc6ca046a0..f177f0aa8645e 100644
--- a/clang/lib/Sema/SemaTemplateDeduction.cpp
+++ b/clang/lib/Sema/SemaTemplateDeduction.cpp
@@ -6858,12 +6858,14 @@ struct MarkUsedTemplateParameterVisitor : DynamicRecursiveASTVisitor {
return true;
}
- bool TraverseTemplateName(TemplateName Template) override {
+ bool TraverseTemplateName(TemplateName Template,
+ bool TraverseQualifier) override {
if (auto *TTP = llvm::dyn_cast_or_null<TemplateTemplateParmDecl>(
Template.getAsTemplateDecl()))
if (TTP->getDepth() == Depth)
Used[TTP->getIndex()] = true;
- DynamicRecursiveASTVisitor::TraverseTemplateName(Template);
+ DynamicRecursiveASTVisitor::TraverseTemplateName(Template,
+ TraverseQualifier);
return true;
}
diff --git a/clang/lib/Sema/SemaTemplateVariadic.cpp b/clang/lib/Sema/SemaTemplateVariadic.cpp
index aa818aad7ff68..a53500f2da497 100644
--- a/clang/lib/Sema/SemaTemplateVariadic.cpp
+++ b/clang/lib/Sema/SemaTemplateVariadic.cpp
@@ -143,7 +143,8 @@ class CollectUnexpandedParameterPacksVisitor
}
/// Record occurrences of template template parameter packs.
- bool TraverseTemplateName(TemplateName Template) override {
+ bool TraverseTemplateName(TemplateName Template,
+ bool TraverseQualifier = true) override {
if (auto *TTP = dyn_cast_or_null<TemplateTemplateParmDecl>(
Template.getAsTemplateDecl())) {
if (TTP->isParameterPack())
@@ -155,7 +156,8 @@ class CollectUnexpandedParameterPacksVisitor
(bool)Template.getAsSubstTemplateTemplateParmPack();
#endif
- return DynamicRecursiveASTVisitor::TraverseTemplateName(Template);
+ return DynamicRecursiveASTVisitor::TraverseTemplateName(
+ Template, TraverseQualifier);
}
bool
``````````
</details>
https://github.com/llvm/llvm-project/pull/218425
More information about the cfe-commits
mailing list