Skip to content

Commit 1b4a711

Browse files
committed
[clang] CTAD: use index and depth to retrieve template parameters in TemplateParamsReferencedInTemplateArgumentList.
1 parent f50f7a7 commit 1b4a711

File tree

2 files changed

+48
-8
lines changed

2 files changed

+48
-8
lines changed

clang/lib/Sema/SemaTemplate.cpp

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -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.
26552655
SmallVector<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());

clang/test/AST/ast-dump-ctad-alias.cpp

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,3 +99,28 @@ BFoo b2(1.0, 2.0);
9999
// CHECK-NEXT: | | |-ParmVarDecl {{.*}} 'type-parameter-0-0'
100100
// CHECK-NEXT: | | `-ParmVarDecl {{.*}} 'type-parameter-0-0'
101101
// CHECK-NEXT: | `-CXXDeductionGuideDecl {{.*}} implicit used <deduction guide for BFoo> 'auto (double, double) -> Foo<double, double>' implicit_instantiation
102+
103+
namespace GH90209 {
104+
template <class Ts>
105+
struct List {
106+
List(int);
107+
};
108+
109+
template <class T1>
110+
struct TemplatedClass {
111+
TemplatedClass(T1);
112+
};
113+
114+
template <class T1>
115+
TemplatedClass(T1) -> TemplatedClass<List<T1>>;
116+
117+
template <class T2>
118+
using ATemplatedClass = TemplatedClass<List<T2>>;
119+
120+
ATemplatedClass test(1);
121+
// Verify that we have a correct template parameter list for the deduction guide.
122+
//
123+
// CHECK: FunctionTemplateDecl {{.*}} <deduction guide for ATemplatedClass>
124+
// CHECK-NEXT: |-TemplateTypeParmDecl {{.*}} class depth 0 index 0 T2
125+
// CHECK-NEXT: |-TypeTraitExpr {{.*}} 'bool' __is_deducible
126+
} // namespace GH90209

0 commit comments

Comments
 (0)