Skip to content

Commit 7626982

Browse files
committed
Address review comment.
1 parent c9297f8 commit 7626982

File tree

1 file changed

+34
-27
lines changed

1 file changed

+34
-27
lines changed

clang/lib/Sema/SemaTemplate.cpp

Lines changed: 34 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
#include "clang/Sema/SemaInternal.h"
3838
#include "clang/Sema/Template.h"
3939
#include "clang/Sema/TemplateDeduction.h"
40+
#include "llvm/ADT/BitVector.h"
4041
#include "llvm/ADT/SmallBitVector.h"
4142
#include "llvm/ADT/SmallString.h"
4243
#include "llvm/ADT/StringExtras.h"
@@ -2751,6 +2752,26 @@ struct ConvertConstructorToDeductionGuideTransform {
27512752
}
27522753
};
27532754

2755+
unsigned getTemplateParameterDepth(NamedDecl *TemplateParam) {
2756+
if (auto *TTP = dyn_cast<TemplateTypeParmDecl>(TemplateParam))
2757+
return TTP->getDepth();
2758+
if (auto *TTP = dyn_cast<TemplateTemplateParmDecl>(TemplateParam))
2759+
return TTP->getDepth();
2760+
if (auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(TemplateParam))
2761+
return NTTP->getDepth();
2762+
llvm_unreachable("Unhandled template parameter types");
2763+
}
2764+
2765+
unsigned getTemplateParameterIndex(NamedDecl *TemplateParam) {
2766+
if (auto *TTP = dyn_cast<TemplateTypeParmDecl>(TemplateParam))
2767+
return TTP->getIndex();
2768+
if (auto *TTP = dyn_cast<TemplateTemplateParmDecl>(TemplateParam))
2769+
return TTP->getIndex();
2770+
if (auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(TemplateParam))
2771+
return NTTP->getIndex();
2772+
llvm_unreachable("Unhandled template parameter types");
2773+
}
2774+
27542775
// Find all template parameters that appear in the given DeducedArgs.
27552776
// Return the indices of the template parameters in the TemplateParams.
27562777
SmallVector<unsigned> TemplateParamsReferencedInTemplateArgumentList(
@@ -2759,26 +2780,17 @@ SmallVector<unsigned> TemplateParamsReferencedInTemplateArgumentList(
27592780
struct TemplateParamsReferencedFinder
27602781
: public RecursiveASTVisitor<TemplateParamsReferencedFinder> {
27612782
const TemplateParameterList* TemplateParamList;
2762-
llvm::DenseSet<NamedDecl *> TemplateParams;
2763-
llvm::DenseSet<const NamedDecl *> ReferencedTemplateParams;
2783+
llvm::BitVector ReferencedTemplateParams;
27642784

27652785
TemplateParamsReferencedFinder(
27662786
const TemplateParameterList *TemplateParamList)
27672787
: TemplateParamList(TemplateParamList),
2768-
TemplateParams(TemplateParamList->begin(), TemplateParamList->end()) {
2769-
}
2788+
ReferencedTemplateParams(TemplateParamList->size()) {}
27702789

27712790
bool VisitTemplateTypeParmType(TemplateTypeParmType *TTP) {
27722791
// We use the index and depth to retrieve the corresponding template
2773-
// parameter from the parameter list.
2774-
// Note that Clang may not preserve type sugar during template argument
2775-
// deduction. In such cases, the TTP is a canonical TemplateTypeParamType,
2776-
// which only retains its index and depth information.
2777-
if (TTP->getDepth() == TemplateParamList->getDepth() &&
2778-
TTP->getIndex() < TemplateParamList->size()) {
2779-
ReferencedTemplateParams.insert(
2780-
TemplateParamList->getParam(TTP->getIndex()));
2781-
}
2792+
// parameter from the parameter list, which is more robost.
2793+
Mark(TTP->getDepth(), TTP->getIndex());
27822794
return true;
27832795
}
27842796

@@ -2794,17 +2806,22 @@ SmallVector<unsigned> TemplateParamsReferencedInTemplateArgumentList(
27942806
}
27952807

27962808
void MarkAppeared(NamedDecl *ND) {
2797-
if (TemplateParams.contains(ND))
2798-
ReferencedTemplateParams.insert(ND);
2809+
if (llvm::isa<NonTypeTemplateParmDecl, TemplateTypeParmDecl,
2810+
TemplateTemplateParmDecl>(ND))
2811+
Mark(getTemplateParameterDepth(ND), getTemplateParameterIndex(ND));
2812+
}
2813+
void Mark(unsigned Depth, unsigned Index) {
2814+
if (Index < TemplateParamList->size() &&
2815+
TemplateParamList->getParam(Index)->getTemplateDepth() == Depth)
2816+
ReferencedTemplateParams.set(Index);
27992817
}
28002818
};
28012819
TemplateParamsReferencedFinder Finder(TemplateParamsList);
28022820
Finder.TraverseTemplateArguments(DeducedArgs);
28032821

28042822
SmallVector<unsigned> Results;
28052823
for (unsigned Index = 0; Index < TemplateParamsList->size(); ++Index) {
2806-
if (Finder.ReferencedTemplateParams.contains(
2807-
TemplateParamsList->getParam(Index)))
2824+
if (Finder.ReferencedTemplateParams[Index])
28082825
Results.push_back(Index);
28092826
}
28102827
return Results;
@@ -2823,16 +2840,6 @@ bool hasDeclaredDeductionGuides(DeclarationName Name, DeclContext *DC) {
28232840
return false;
28242841
}
28252842

2826-
unsigned getTemplateParameterDepth(NamedDecl *TemplateParam) {
2827-
if (auto *TTP = dyn_cast<TemplateTypeParmDecl>(TemplateParam))
2828-
return TTP->getDepth();
2829-
if (auto *TTP = dyn_cast<TemplateTemplateParmDecl>(TemplateParam))
2830-
return TTP->getDepth();
2831-
if (auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(TemplateParam))
2832-
return NTTP->getDepth();
2833-
llvm_unreachable("Unhandled template parameter types");
2834-
}
2835-
28362843
NamedDecl *transformTemplateParameter(Sema &SemaRef, DeclContext *DC,
28372844
NamedDecl *TemplateParam,
28382845
MultiLevelTemplateArgumentList &Args,

0 commit comments

Comments
 (0)