Skip to content

Commit c5d4dfb

Browse files
authored
[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.
1 parent 032ad59 commit c5d4dfb

File tree

3 files changed

+18
-45
lines changed

3 files changed

+18
-45
lines changed

clang/include/clang/Sema/Sema.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12620,6 +12620,10 @@ class Sema final : public SemaBase {
1262012620
void MarkUsedTemplateParameters(const TemplateArgumentList &TemplateArgs,
1262112621
bool OnlyDeduced, unsigned Depth,
1262212622
llvm::SmallBitVector &Used);
12623+
12624+
void MarkUsedTemplateParameters(ArrayRef<TemplateArgument> TemplateArgs,
12625+
unsigned Depth, llvm::SmallBitVector &Used);
12626+
1262312627
void
1262412628
MarkDeducedTemplateParameters(const FunctionTemplateDecl *FunctionTemplate,
1262512629
llvm::SmallBitVector &Deduced) {

clang/lib/Sema/SemaTemplateDeduction.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7178,6 +7178,14 @@ Sema::MarkUsedTemplateParameters(const TemplateArgumentList &TemplateArgs,
71787178
Depth, Used);
71797179
}
71807180

7181+
void Sema::MarkUsedTemplateParameters(ArrayRef<TemplateArgument> TemplateArgs,
7182+
unsigned Depth,
7183+
llvm::SmallBitVector &Used) {
7184+
for (unsigned I = 0, N = TemplateArgs.size(); I != N; ++I)
7185+
::MarkUsedTemplateParameters(Context, TemplateArgs[I],
7186+
/*OnlyDeduced=*/false, Depth, Used);
7187+
}
7188+
71817189
void Sema::MarkDeducedTemplateParameters(
71827190
ASTContext &Ctx, const FunctionTemplateDecl *FunctionTemplate,
71837191
llvm::SmallBitVector &Deduced) {

clang/lib/Sema/SemaTemplateDeductionGuide.cpp

Lines changed: 6 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
#include "clang/AST/DeclFriend.h"
2222
#include "clang/AST/DeclTemplate.h"
2323
#include "clang/AST/DeclarationName.h"
24-
#include "clang/AST/DynamicRecursiveASTVisitor.h"
2524
#include "clang/AST/Expr.h"
2625
#include "clang/AST/ExprCXX.h"
2726
#include "clang/AST/OperationKinds.h"
@@ -681,54 +680,16 @@ struct ConvertConstructorToDeductionGuideTransform {
681680
// Find all template parameters that appear in the given DeducedArgs.
682681
// Return the indices of the template parameters in the TemplateParams.
683682
SmallVector<unsigned> TemplateParamsReferencedInTemplateArgumentList(
684-
const TemplateParameterList *TemplateParamsList,
683+
Sema &SemaRef, const TemplateParameterList *TemplateParamsList,
685684
ArrayRef<TemplateArgument> DeducedArgs) {
686-
struct TemplateParamsReferencedFinder : DynamicRecursiveASTVisitor {
687-
const TemplateParameterList *TemplateParamList;
688-
llvm::BitVector ReferencedTemplateParams;
689-
690-
TemplateParamsReferencedFinder(
691-
const TemplateParameterList *TemplateParamList)
692-
: TemplateParamList(TemplateParamList),
693-
ReferencedTemplateParams(TemplateParamList->size()) {}
694-
695-
bool VisitTemplateTypeParmType(TemplateTypeParmType *TTP) override {
696-
// We use the index and depth to retrieve the corresponding template
697-
// parameter from the parameter list, which is more robost.
698-
Mark(TTP->getDepth(), TTP->getIndex());
699-
return true;
700-
}
701-
702-
bool VisitDeclRefExpr(DeclRefExpr *DRE) override {
703-
MarkAppeared(DRE->getFoundDecl());
704-
return true;
705-
}
706685

707-
bool TraverseTemplateName(TemplateName Template) override {
708-
if (auto *TD = Template.getAsTemplateDecl())
709-
MarkAppeared(TD);
710-
return DynamicRecursiveASTVisitor::TraverseTemplateName(Template);
711-
}
712-
713-
void MarkAppeared(NamedDecl *ND) {
714-
if (llvm::isa<NonTypeTemplateParmDecl, TemplateTypeParmDecl,
715-
TemplateTemplateParmDecl>(ND)) {
716-
auto [Depth, Index] = getDepthAndIndex(ND);
717-
Mark(Depth, Index);
718-
}
719-
}
720-
void Mark(unsigned Depth, unsigned Index) {
721-
if (Index < TemplateParamList->size() &&
722-
TemplateParamList->getParam(Index)->getTemplateDepth() == Depth)
723-
ReferencedTemplateParams.set(Index);
724-
}
725-
};
726-
TemplateParamsReferencedFinder Finder(TemplateParamsList);
727-
Finder.TraverseTemplateArguments(DeducedArgs);
686+
llvm::SmallBitVector ReferencedTemplateParams(TemplateParamsList->size());
687+
SemaRef.MarkUsedTemplateParameters(
688+
DeducedArgs, TemplateParamsList->getDepth(), ReferencedTemplateParams);
728689

729690
SmallVector<unsigned> Results;
730691
for (unsigned Index = 0; Index < TemplateParamsList->size(); ++Index) {
731-
if (Finder.ReferencedTemplateParams[Index])
692+
if (ReferencedTemplateParams[Index])
732693
Results.push_back(Index);
733694
}
734695
return Results;
@@ -1099,7 +1060,7 @@ BuildDeductionGuideForTypeAlias(Sema &SemaRef,
10991060
}
11001061
auto DeducedAliasTemplateParams =
11011062
TemplateParamsReferencedInTemplateArgumentList(
1102-
AliasTemplate->getTemplateParameters(), DeducedArgs);
1063+
SemaRef, AliasTemplate->getTemplateParameters(), DeducedArgs);
11031064
// All template arguments null by default.
11041065
SmallVector<TemplateArgument> TemplateArgsForBuildingFPrime(
11051066
F->getTemplateParameters()->size());

0 commit comments

Comments
 (0)