Skip to content

Commit 146b209

Browse files
committed
[Clang][Sema] Use the correct injected template arguments for partial specializations when collecting multi-level template argument lists
1 parent 3dedcab commit 146b209

File tree

3 files changed

+43
-3
lines changed

3 files changed

+43
-3
lines changed

clang/include/clang/AST/DeclTemplate.h

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2085,7 +2085,9 @@ class ClassTemplateSpecializationDecl : public CXXRecordDecl,
20852085
class ClassTemplatePartialSpecializationDecl
20862086
: public ClassTemplateSpecializationDecl {
20872087
/// The list of template parameters
2088-
TemplateParameterList* TemplateParams = nullptr;
2088+
TemplateParameterList *TemplateParams = nullptr;
2089+
2090+
TemplateArgument *InjectedArgs = nullptr;
20892091

20902092
/// The class template partial specialization from which this
20912093
/// class template partial specialization was instantiated.
@@ -2132,6 +2134,10 @@ class ClassTemplatePartialSpecializationDecl
21322134
return TemplateParams;
21332135
}
21342136

2137+
/// Retrieve the template arguments list of the template parameter list
2138+
/// of this template.
2139+
ArrayRef<TemplateArgument> getInjectedTemplateArgs();
2140+
21352141
/// \brief All associated constraints of this partial specialization,
21362142
/// including the requires clause and any constraints derived from
21372143
/// constrained-parameters.
@@ -2856,6 +2862,8 @@ class VarTemplatePartialSpecializationDecl
28562862
/// The list of template parameters
28572863
TemplateParameterList *TemplateParams = nullptr;
28582864

2865+
TemplateArgument *InjectedArgs = nullptr;
2866+
28592867
/// The variable template partial specialization from which this
28602868
/// variable template partial specialization was instantiated.
28612869
///
@@ -2902,6 +2910,10 @@ class VarTemplatePartialSpecializationDecl
29022910
return TemplateParams;
29032911
}
29042912

2913+
/// Retrieve the template arguments list of the template parameter list
2914+
/// of this template.
2915+
ArrayRef<TemplateArgument> getInjectedTemplateArgs();
2916+
29052917
/// \brief All associated constraints of this partial specialization,
29062918
/// including the requires clause and any constraints derived from
29072919
/// constrained-parameters.

clang/lib/AST/DeclTemplate.cpp

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1185,6 +1185,20 @@ SourceRange ClassTemplatePartialSpecializationDecl::getSourceRange() const {
11851185
return Range;
11861186
}
11871187

1188+
ArrayRef<TemplateArgument>
1189+
ClassTemplatePartialSpecializationDecl::getInjectedTemplateArgs() {
1190+
TemplateParameterList *Params = getTemplateParameters();
1191+
auto *First = cast<ClassTemplatePartialSpecializationDecl>(getFirstDecl());
1192+
if (!First->InjectedArgs) {
1193+
auto &Context = getASTContext();
1194+
SmallVector<TemplateArgument, 16> TemplateArgs;
1195+
Context.getInjectedTemplateArgs(Params, TemplateArgs);
1196+
First->InjectedArgs = new (Context) TemplateArgument[TemplateArgs.size()];
1197+
std::copy(TemplateArgs.begin(), TemplateArgs.end(), First->InjectedArgs);
1198+
}
1199+
return llvm::ArrayRef(First->InjectedArgs, Params->size());
1200+
}
1201+
11881202
//===----------------------------------------------------------------------===//
11891203
// FriendTemplateDecl Implementation
11901204
//===----------------------------------------------------------------------===//
@@ -1535,6 +1549,20 @@ SourceRange VarTemplatePartialSpecializationDecl::getSourceRange() const {
15351549
return Range;
15361550
}
15371551

1552+
ArrayRef<TemplateArgument>
1553+
VarTemplatePartialSpecializationDecl::getInjectedTemplateArgs() {
1554+
TemplateParameterList *Params = getTemplateParameters();
1555+
auto *First = cast<VarTemplatePartialSpecializationDecl>(getFirstDecl());
1556+
if (!First->InjectedArgs) {
1557+
auto &Context = getASTContext();
1558+
SmallVector<TemplateArgument, 16> TemplateArgs;
1559+
Context.getInjectedTemplateArgs(Params, TemplateArgs);
1560+
First->InjectedArgs = new (Context) TemplateArgument[TemplateArgs.size()];
1561+
std::copy(TemplateArgs.begin(), TemplateArgs.end(), First->InjectedArgs);
1562+
}
1563+
return llvm::ArrayRef(First->InjectedArgs, Params->size());
1564+
}
1565+
15381566
static TemplateParameterList *
15391567
createMakeIntegerSeqParameterList(const ASTContext &C, DeclContext *DC) {
15401568
// typename T

clang/lib/Sema/SemaTemplateInstantiate.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -237,7 +237,7 @@ struct TemplateInstantiationArgumentCollecter
237237
if (Innermost)
238238
AddInnermostTemplateArguments(VTPSD);
239239
else if (ForConstraintInstantiation)
240-
AddOuterTemplateArguments(VTPSD, VTPSD->getTemplateArgs().asArray(),
240+
AddOuterTemplateArguments(VTPSD, VTPSD->getInjectedTemplateArgs(),
241241
/*Final=*/false);
242242

243243
if (VTPSD->isMemberSpecialization())
@@ -274,7 +274,7 @@ struct TemplateInstantiationArgumentCollecter
274274
if (Innermost)
275275
AddInnermostTemplateArguments(CTPSD);
276276
else if (ForConstraintInstantiation)
277-
AddOuterTemplateArguments(CTPSD, CTPSD->getTemplateArgs().asArray(),
277+
AddOuterTemplateArguments(CTPSD, CTPSD->getInjectedTemplateArgs(),
278278
/*Final=*/false);
279279

280280
if (CTPSD->isMemberSpecialization())

0 commit comments

Comments
 (0)