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