37
37
#include "clang/Sema/SemaInternal.h"
38
38
#include "clang/Sema/Template.h"
39
39
#include "clang/Sema/TemplateDeduction.h"
40
+ #include "llvm/ADT/BitVector.h"
40
41
#include "llvm/ADT/SmallBitVector.h"
41
42
#include "llvm/ADT/SmallString.h"
42
43
#include "llvm/ADT/StringExtras.h"
@@ -2751,23 +2752,48 @@ struct ConvertConstructorToDeductionGuideTransform {
2751
2752
}
2752
2753
};
2753
2754
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
+
2754
2775
// Find all template parameters that appear in the given DeducedArgs.
2755
2776
// Return the indices of the template parameters in the TemplateParams.
2756
2777
SmallVector<unsigned> TemplateParamsReferencedInTemplateArgumentList(
2757
- ArrayRef<NamedDecl *> TemplateParams ,
2778
+ const TemplateParameterList *TemplateParamsList ,
2758
2779
ArrayRef<TemplateArgument> DeducedArgs) {
2759
2780
struct TemplateParamsReferencedFinder
2760
2781
: public RecursiveASTVisitor<TemplateParamsReferencedFinder> {
2761
- llvm::DenseSet<NamedDecl *> TemplateParams ;
2762
- llvm::DenseSet<const NamedDecl *> ReferencedTemplateParams;
2782
+ const TemplateParameterList *TemplateParamList ;
2783
+ llvm::BitVector ReferencedTemplateParams;
2763
2784
2764
- TemplateParamsReferencedFinder(ArrayRef<NamedDecl *> TemplateParams)
2765
- : TemplateParams(TemplateParams.begin(), TemplateParams.end()) {}
2785
+ TemplateParamsReferencedFinder(
2786
+ const TemplateParameterList *TemplateParamList)
2787
+ : TemplateParamList(TemplateParamList),
2788
+ ReferencedTemplateParams(TemplateParamList->size()) {}
2766
2789
2767
2790
bool VisitTemplateTypeParmType(TemplateTypeParmType *TTP) {
2768
- MarkAppeared(TTP->getDecl());
2791
+ // We use the index and depth to retrieve the corresponding template
2792
+ // parameter from the parameter list, which is more robost.
2793
+ Mark(TTP->getDepth(), TTP->getIndex());
2769
2794
return true;
2770
2795
}
2796
+
2771
2797
bool VisitDeclRefExpr(DeclRefExpr *DRE) {
2772
2798
MarkAppeared(DRE->getFoundDecl());
2773
2799
return true;
@@ -2780,16 +2806,22 @@ SmallVector<unsigned> TemplateParamsReferencedInTemplateArgumentList(
2780
2806
}
2781
2807
2782
2808
void MarkAppeared(NamedDecl *ND) {
2783
- if (TemplateParams.contains(ND))
2784
- 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);
2785
2817
}
2786
2818
};
2787
- TemplateParamsReferencedFinder Finder(TemplateParams );
2819
+ TemplateParamsReferencedFinder Finder(TemplateParamsList );
2788
2820
Finder.TraverseTemplateArguments(DeducedArgs);
2789
2821
2790
2822
SmallVector<unsigned> Results;
2791
- for (unsigned Index = 0; Index < TemplateParams. size(); ++Index) {
2792
- if (Finder.ReferencedTemplateParams.contains(TemplateParams [Index]) )
2823
+ for (unsigned Index = 0; Index < TemplateParamsList-> size(); ++Index) {
2824
+ if (Finder.ReferencedTemplateParams[Index])
2793
2825
Results.push_back(Index);
2794
2826
}
2795
2827
return Results;
@@ -2808,16 +2840,6 @@ bool hasDeclaredDeductionGuides(DeclarationName Name, DeclContext *DC) {
2808
2840
return false;
2809
2841
}
2810
2842
2811
- unsigned getTemplateParameterDepth(NamedDecl *TemplateParam) {
2812
- if (auto *TTP = dyn_cast<TemplateTypeParmDecl>(TemplateParam))
2813
- return TTP->getDepth();
2814
- if (auto *TTP = dyn_cast<TemplateTemplateParmDecl>(TemplateParam))
2815
- return TTP->getDepth();
2816
- if (auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(TemplateParam))
2817
- return NTTP->getDepth();
2818
- llvm_unreachable("Unhandled template parameter types");
2819
- }
2820
-
2821
2843
NamedDecl *transformTemplateParameter(Sema &SemaRef, DeclContext *DC,
2822
2844
NamedDecl *TemplateParam,
2823
2845
MultiLevelTemplateArgumentList &Args,
@@ -3149,7 +3171,7 @@ BuildDeductionGuideForTypeAlias(Sema &SemaRef,
3149
3171
}
3150
3172
auto DeducedAliasTemplateParams =
3151
3173
TemplateParamsReferencedInTemplateArgumentList(
3152
- AliasTemplate->getTemplateParameters()->asArray() , DeducedArgs);
3174
+ AliasTemplate->getTemplateParameters(), DeducedArgs);
3153
3175
// All template arguments null by default.
3154
3176
SmallVector<TemplateArgument> TemplateArgsForBuildingFPrime(
3155
3177
F->getTemplateParameters()->size());
0 commit comments