@@ -2653,20 +2653,34 @@ struct ConvertConstructorToDeductionGuideTransform {
2653
2653
// Find all template parameters that appear in the given DeducedArgs.
2654
2654
// Return the indices of the template parameters in the TemplateParams.
2655
2655
SmallVector<unsigned > TemplateParamsReferencedInTemplateArgumentList (
2656
- ArrayRef<NamedDecl *> TemplateParams ,
2656
+ const TemplateParameterList* TemplateParamsList ,
2657
2657
ArrayRef<TemplateArgument> DeducedArgs) {
2658
2658
struct TemplateParamsReferencedFinder
2659
2659
: public RecursiveASTVisitor<TemplateParamsReferencedFinder> {
2660
+ const TemplateParameterList* TemplateParamList;
2660
2661
llvm::DenseSet<NamedDecl *> TemplateParams;
2661
2662
llvm::DenseSet<const NamedDecl *> ReferencedTemplateParams;
2662
2663
2663
- TemplateParamsReferencedFinder (ArrayRef<NamedDecl *> TemplateParams)
2664
- : TemplateParams(TemplateParams.begin(), TemplateParams.end()) {}
2664
+ TemplateParamsReferencedFinder (
2665
+ const TemplateParameterList *TemplateParamList)
2666
+ : TemplateParamList(TemplateParamList),
2667
+ TemplateParams (TemplateParamList->begin (), TemplateParamList->end()) {
2668
+ }
2665
2669
2666
2670
bool VisitTemplateTypeParmType (TemplateTypeParmType *TTP) {
2667
- MarkAppeared (TTP->getDecl ());
2671
+ // We use the index and depth to retrieve the corresponding template
2672
+ // parameter from the parameter list.
2673
+ // Note that Clang may not preserve type sugar during template argument
2674
+ // deduction. In such cases, the TTP is a canonical TemplateTypeParamType,
2675
+ // which only retains its index and depth information.
2676
+ if (TTP->getDepth () == TemplateParamList->getDepth () &&
2677
+ TTP->getIndex () < TemplateParamList->size ()) {
2678
+ ReferencedTemplateParams.insert (
2679
+ TemplateParamList->getParam (TTP->getIndex ()));
2680
+ }
2668
2681
return true ;
2669
2682
}
2683
+
2670
2684
bool VisitDeclRefExpr (DeclRefExpr *DRE) {
2671
2685
MarkAppeared (DRE->getFoundDecl ());
2672
2686
return true ;
@@ -2683,12 +2697,13 @@ SmallVector<unsigned> TemplateParamsReferencedInTemplateArgumentList(
2683
2697
ReferencedTemplateParams.insert (ND);
2684
2698
}
2685
2699
};
2686
- TemplateParamsReferencedFinder Finder (TemplateParams );
2700
+ TemplateParamsReferencedFinder Finder (TemplateParamsList );
2687
2701
Finder.TraverseTemplateArguments(DeducedArgs);
2688
2702
2689
2703
SmallVector<unsigned > Results;
2690
- for (unsigned Index = 0 ; Index < TemplateParams.size (); ++Index) {
2691
- if (Finder.ReferencedTemplateParams .contains (TemplateParams[Index]))
2704
+ for (unsigned Index = 0 ; Index < TemplateParamsList->size (); ++Index) {
2705
+ if (Finder.ReferencedTemplateParams .contains (
2706
+ TemplateParamsList->getParam (Index)))
2692
2707
Results.push_back (Index);
2693
2708
}
2694
2709
return Results;
@@ -3047,7 +3062,7 @@ BuildDeductionGuideForTypeAlias(Sema &SemaRef,
3047
3062
}
3048
3063
auto DeducedAliasTemplateParams =
3049
3064
TemplateParamsReferencedInTemplateArgumentList (
3050
- AliasTemplate->getTemplateParameters ()-> asArray () , DeducedArgs);
3065
+ AliasTemplate->getTemplateParameters (), DeducedArgs);
3051
3066
// All template arguments null by default.
3052
3067
SmallVector<TemplateArgument> TemplateArgsForBuildingFPrime (
3053
3068
F->getTemplateParameters ()->size ());
0 commit comments