@@ -2754,20 +2754,34 @@ struct ConvertConstructorToDeductionGuideTransform {
2754
2754
// Find all template parameters that appear in the given DeducedArgs.
2755
2755
// Return the indices of the template parameters in the TemplateParams.
2756
2756
SmallVector<unsigned > TemplateParamsReferencedInTemplateArgumentList (
2757
- ArrayRef<NamedDecl *> TemplateParams ,
2757
+ const TemplateParameterList* TemplateParamsList ,
2758
2758
ArrayRef<TemplateArgument> DeducedArgs) {
2759
2759
struct TemplateParamsReferencedFinder
2760
2760
: public RecursiveASTVisitor<TemplateParamsReferencedFinder> {
2761
+ const TemplateParameterList* TemplateParamList;
2761
2762
llvm::DenseSet<NamedDecl *> TemplateParams;
2762
2763
llvm::DenseSet<const NamedDecl *> ReferencedTemplateParams;
2763
2764
2764
- TemplateParamsReferencedFinder (ArrayRef<NamedDecl *> TemplateParams)
2765
- : TemplateParams(TemplateParams.begin(), TemplateParams.end()) {}
2765
+ TemplateParamsReferencedFinder (
2766
+ const TemplateParameterList *TemplateParamList)
2767
+ : TemplateParamList(TemplateParamList),
2768
+ TemplateParams (TemplateParamList->begin (), TemplateParamList->end()) {
2769
+ }
2766
2770
2767
2771
bool VisitTemplateTypeParmType (TemplateTypeParmType *TTP) {
2768
- MarkAppeared (TTP->getDecl ());
2772
+ // 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
+ }
2769
2782
return true ;
2770
2783
}
2784
+
2771
2785
bool VisitDeclRefExpr (DeclRefExpr *DRE) {
2772
2786
MarkAppeared (DRE->getFoundDecl ());
2773
2787
return true ;
@@ -2784,12 +2798,13 @@ SmallVector<unsigned> TemplateParamsReferencedInTemplateArgumentList(
2784
2798
ReferencedTemplateParams.insert (ND);
2785
2799
}
2786
2800
};
2787
- TemplateParamsReferencedFinder Finder (TemplateParams );
2801
+ TemplateParamsReferencedFinder Finder (TemplateParamsList );
2788
2802
Finder.TraverseTemplateArguments(DeducedArgs);
2789
2803
2790
2804
SmallVector<unsigned > Results;
2791
- for (unsigned Index = 0 ; Index < TemplateParams.size (); ++Index) {
2792
- if (Finder.ReferencedTemplateParams .contains (TemplateParams[Index]))
2805
+ for (unsigned Index = 0 ; Index < TemplateParamsList->size (); ++Index) {
2806
+ if (Finder.ReferencedTemplateParams .contains (
2807
+ TemplateParamsList->getParam (Index)))
2793
2808
Results.push_back (Index);
2794
2809
}
2795
2810
return Results;
@@ -3149,7 +3164,7 @@ BuildDeductionGuideForTypeAlias(Sema &SemaRef,
3149
3164
}
3150
3165
auto DeducedAliasTemplateParams =
3151
3166
TemplateParamsReferencedInTemplateArgumentList (
3152
- AliasTemplate->getTemplateParameters ()-> asArray () , DeducedArgs);
3167
+ AliasTemplate->getTemplateParameters (), DeducedArgs);
3153
3168
// All template arguments null by default.
3154
3169
SmallVector<TemplateArgument> TemplateArgsForBuildingFPrime (
3155
3170
F->getTemplateParameters ()->size ());
0 commit comments