@@ -2653,20 +2653,34 @@ struct ConvertConstructorToDeductionGuideTransform {
26532653// Find all template parameters that appear in the given DeducedArgs.
26542654// Return the indices of the template parameters in the TemplateParams.
26552655SmallVector<unsigned > TemplateParamsReferencedInTemplateArgumentList (
2656- ArrayRef<NamedDecl *> TemplateParams ,
2656+ const TemplateParameterList* TemplateParamsList ,
26572657 ArrayRef<TemplateArgument> DeducedArgs) {
26582658 struct TemplateParamsReferencedFinder
26592659 : public RecursiveASTVisitor<TemplateParamsReferencedFinder> {
2660+ const TemplateParameterList* TemplateParamList;
26602661 llvm::DenseSet<NamedDecl *> TemplateParams;
26612662 llvm::DenseSet<const NamedDecl *> ReferencedTemplateParams;
26622663
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+ }
26652669
26662670 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+ }
26682681 return true ;
26692682 }
2683+
26702684 bool VisitDeclRefExpr (DeclRefExpr *DRE) {
26712685 MarkAppeared (DRE->getFoundDecl ());
26722686 return true ;
@@ -2683,12 +2697,13 @@ SmallVector<unsigned> TemplateParamsReferencedInTemplateArgumentList(
26832697 ReferencedTemplateParams.insert (ND);
26842698 }
26852699 };
2686- TemplateParamsReferencedFinder Finder (TemplateParams );
2700+ TemplateParamsReferencedFinder Finder (TemplateParamsList );
26872701 Finder.TraverseTemplateArguments(DeducedArgs);
26882702
26892703 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)))
26922707 Results.push_back (Index);
26932708 }
26942709 return Results;
@@ -3047,7 +3062,7 @@ BuildDeductionGuideForTypeAlias(Sema &SemaRef,
30473062 }
30483063 auto DeducedAliasTemplateParams =
30493064 TemplateParamsReferencedInTemplateArgumentList (
3050- AliasTemplate->getTemplateParameters ()-> asArray () , DeducedArgs);
3065+ AliasTemplate->getTemplateParameters (), DeducedArgs);
30513066 // All template arguments null by default.
30523067 SmallVector<TemplateArgument> TemplateArgsForBuildingFPrime (
30533068 F->getTemplateParameters ()->size ());
0 commit comments