[clang] c5d4dfb - [Clang][NFC] Use MarkUsedTemplateParameters in building alias CTAD guides (#132369)
via cfe-commits
cfe-commits at lists.llvm.org
Sat Mar 22 08:04:50 PDT 2025
Author: Younan Zhang
Date: 2025-03-22T23:04:46+08:00
New Revision: c5d4dfb291af1f9c099c25b78dd2ea0a6496a45f
URL: https://github.com/llvm/llvm-project/commit/c5d4dfb291af1f9c099c25b78dd2ea0a6496a45f
DIFF: https://github.com/llvm/llvm-project/commit/c5d4dfb291af1f9c099c25b78dd2ea0a6496a45f.diff
LOG: [Clang][NFC] Use MarkUsedTemplateParameters in building alias CTAD guides (#132369)
It turns out that TemplateParamsReferencedInTemplateArgumentList() and
MarkUsedTemplateParameters() have the similar goal, so let's drop the
hand-written ASTVisitor.
Added:
Modified:
clang/include/clang/Sema/Sema.h
clang/lib/Sema/SemaTemplateDeduction.cpp
clang/lib/Sema/SemaTemplateDeductionGuide.cpp
Removed:
################################################################################
diff --git a/clang/include/clang/Sema/Sema.h b/clang/include/clang/Sema/Sema.h
index 04c25121f4c23..066bce61c74c1 100644
--- a/clang/include/clang/Sema/Sema.h
+++ b/clang/include/clang/Sema/Sema.h
@@ -12620,6 +12620,10 @@ class Sema final : public SemaBase {
void MarkUsedTemplateParameters(const TemplateArgumentList &TemplateArgs,
bool OnlyDeduced, unsigned Depth,
llvm::SmallBitVector &Used);
+
+ void MarkUsedTemplateParameters(ArrayRef<TemplateArgument> TemplateArgs,
+ unsigned Depth, llvm::SmallBitVector &Used);
+
void
MarkDeducedTemplateParameters(const FunctionTemplateDecl *FunctionTemplate,
llvm::SmallBitVector &Deduced) {
diff --git a/clang/lib/Sema/SemaTemplateDeduction.cpp b/clang/lib/Sema/SemaTemplateDeduction.cpp
index c3bec6bdebbcf..410b5a2c83e8d 100644
--- a/clang/lib/Sema/SemaTemplateDeduction.cpp
+++ b/clang/lib/Sema/SemaTemplateDeduction.cpp
@@ -7178,6 +7178,14 @@ Sema::MarkUsedTemplateParameters(const TemplateArgumentList &TemplateArgs,
Depth, Used);
}
+void Sema::MarkUsedTemplateParameters(ArrayRef<TemplateArgument> TemplateArgs,
+ unsigned Depth,
+ llvm::SmallBitVector &Used) {
+ for (unsigned I = 0, N = TemplateArgs.size(); I != N; ++I)
+ ::MarkUsedTemplateParameters(Context, TemplateArgs[I],
+ /*OnlyDeduced=*/false, Depth, Used);
+}
+
void Sema::MarkDeducedTemplateParameters(
ASTContext &Ctx, const FunctionTemplateDecl *FunctionTemplate,
llvm::SmallBitVector &Deduced) {
diff --git a/clang/lib/Sema/SemaTemplateDeductionGuide.cpp b/clang/lib/Sema/SemaTemplateDeductionGuide.cpp
index 5dfd8dd1d3b05..9cfdb7596b660 100644
--- a/clang/lib/Sema/SemaTemplateDeductionGuide.cpp
+++ b/clang/lib/Sema/SemaTemplateDeductionGuide.cpp
@@ -21,7 +21,6 @@
#include "clang/AST/DeclFriend.h"
#include "clang/AST/DeclTemplate.h"
#include "clang/AST/DeclarationName.h"
-#include "clang/AST/DynamicRecursiveASTVisitor.h"
#include "clang/AST/Expr.h"
#include "clang/AST/ExprCXX.h"
#include "clang/AST/OperationKinds.h"
@@ -681,54 +680,16 @@ struct ConvertConstructorToDeductionGuideTransform {
// Find all template parameters that appear in the given DeducedArgs.
// Return the indices of the template parameters in the TemplateParams.
SmallVector<unsigned> TemplateParamsReferencedInTemplateArgumentList(
- const TemplateParameterList *TemplateParamsList,
+ Sema &SemaRef, const TemplateParameterList *TemplateParamsList,
ArrayRef<TemplateArgument> DeducedArgs) {
- struct TemplateParamsReferencedFinder : DynamicRecursiveASTVisitor {
- const TemplateParameterList *TemplateParamList;
- llvm::BitVector ReferencedTemplateParams;
-
- TemplateParamsReferencedFinder(
- const TemplateParameterList *TemplateParamList)
- : TemplateParamList(TemplateParamList),
- ReferencedTemplateParams(TemplateParamList->size()) {}
-
- bool VisitTemplateTypeParmType(TemplateTypeParmType *TTP) override {
- // We use the index and depth to retrieve the corresponding template
- // parameter from the parameter list, which is more robost.
- Mark(TTP->getDepth(), TTP->getIndex());
- return true;
- }
-
- bool VisitDeclRefExpr(DeclRefExpr *DRE) override {
- MarkAppeared(DRE->getFoundDecl());
- return true;
- }
- bool TraverseTemplateName(TemplateName Template) override {
- if (auto *TD = Template.getAsTemplateDecl())
- MarkAppeared(TD);
- return DynamicRecursiveASTVisitor::TraverseTemplateName(Template);
- }
-
- void MarkAppeared(NamedDecl *ND) {
- if (llvm::isa<NonTypeTemplateParmDecl, TemplateTypeParmDecl,
- TemplateTemplateParmDecl>(ND)) {
- auto [Depth, Index] = getDepthAndIndex(ND);
- Mark(Depth, Index);
- }
- }
- void Mark(unsigned Depth, unsigned Index) {
- if (Index < TemplateParamList->size() &&
- TemplateParamList->getParam(Index)->getTemplateDepth() == Depth)
- ReferencedTemplateParams.set(Index);
- }
- };
- TemplateParamsReferencedFinder Finder(TemplateParamsList);
- Finder.TraverseTemplateArguments(DeducedArgs);
+ llvm::SmallBitVector ReferencedTemplateParams(TemplateParamsList->size());
+ SemaRef.MarkUsedTemplateParameters(
+ DeducedArgs, TemplateParamsList->getDepth(), ReferencedTemplateParams);
SmallVector<unsigned> Results;
for (unsigned Index = 0; Index < TemplateParamsList->size(); ++Index) {
- if (Finder.ReferencedTemplateParams[Index])
+ if (ReferencedTemplateParams[Index])
Results.push_back(Index);
}
return Results;
@@ -1099,7 +1060,7 @@ BuildDeductionGuideForTypeAlias(Sema &SemaRef,
}
auto DeducedAliasTemplateParams =
TemplateParamsReferencedInTemplateArgumentList(
- AliasTemplate->getTemplateParameters(), DeducedArgs);
+ SemaRef, AliasTemplate->getTemplateParameters(), DeducedArgs);
// All template arguments null by default.
SmallVector<TemplateArgument> TemplateArgsForBuildingFPrime(
F->getTemplateParameters()->size());
More information about the cfe-commits
mailing list