Skip to content

Commit 3fd8326

Browse files
committed
[FOLD] add ASTContext parameter
1 parent 6099234 commit 3fd8326

File tree

4 files changed

+33
-29
lines changed

4 files changed

+33
-29
lines changed

clang/include/clang/AST/DeclTemplate.h

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ class TemplateParameterList final
7272
: private llvm::TrailingObjects<TemplateParameterList, NamedDecl *,
7373
Expr *> {
7474
/// The template argument list of the template parameter list.
75-
llvm::PointerUnion<const ASTContext *, TemplateArgument *> InjectedArgs;
75+
TemplateArgument *InjectedArgs = nullptr;
7676

7777
/// The location of the 'template' keyword.
7878
SourceLocation TemplateLoc;
@@ -200,7 +200,7 @@ class TemplateParameterList final
200200
bool hasAssociatedConstraints() const;
201201

202202
/// Get the template argument list of the template parameter list.
203-
ArrayRef<TemplateArgument> getInjectedTemplateArgs();
203+
ArrayRef<TemplateArgument> getInjectedTemplateArgs(const ASTContext &Context);
204204

205205
SourceLocation getTemplateLoc() const { return TemplateLoc; }
206206
SourceLocation getLAngleLoc() const { return LAngleLoc; }
@@ -924,8 +924,9 @@ class RedeclarableTemplateDecl : public TemplateDecl,
924924
/// Although the C++ standard has no notion of the "injected" template
925925
/// arguments for a template, the notion is convenient when
926926
/// we need to perform substitutions inside the definition of a template.
927-
ArrayRef<TemplateArgument> getInjectedTemplateArgs() const {
928-
return getTemplateParameters()->getInjectedTemplateArgs();
927+
ArrayRef<TemplateArgument>
928+
getInjectedTemplateArgs(const ASTContext &Context) const {
929+
return getTemplateParameters()->getInjectedTemplateArgs(Context);
929930
}
930931

931932
using redecl_range = redeclarable_base::redecl_range;
@@ -2132,8 +2133,9 @@ class ClassTemplatePartialSpecializationDecl
21322133
}
21332134

21342135
/// Get the template argument list of the template parameter list.
2135-
ArrayRef<TemplateArgument> getInjectedTemplateArgs() const {
2136-
return getTemplateParameters()->getInjectedTemplateArgs();
2136+
ArrayRef<TemplateArgument>
2137+
getInjectedTemplateArgs(const ASTContext &Context) const {
2138+
return getTemplateParameters()->getInjectedTemplateArgs(Context);
21372139
}
21382140

21392141
/// \brief All associated constraints of this partial specialization,
@@ -2907,8 +2909,9 @@ class VarTemplatePartialSpecializationDecl
29072909
}
29082910

29092911
/// Get the template argument list of the template parameter list.
2910-
ArrayRef<TemplateArgument> getInjectedTemplateArgs() const {
2911-
return getTemplateParameters()->getInjectedTemplateArgs();
2912+
ArrayRef<TemplateArgument>
2913+
getInjectedTemplateArgs(const ASTContext &Context) const {
2914+
return getTemplateParameters()->getInjectedTemplateArgs(Context);
29122915
}
29132916

29142917
/// \brief All associated constraints of this partial specialization,

clang/lib/AST/DeclTemplate.cpp

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -57,9 +57,8 @@ TemplateParameterList::TemplateParameterList(const ASTContext &C,
5757
ArrayRef<NamedDecl *> Params,
5858
SourceLocation RAngleLoc,
5959
Expr *RequiresClause)
60-
: InjectedArgs(&C), TemplateLoc(TemplateLoc), LAngleLoc(LAngleLoc),
61-
RAngleLoc(RAngleLoc), NumParams(Params.size()),
62-
ContainsUnexpandedParameterPack(false),
60+
: TemplateLoc(TemplateLoc), LAngleLoc(LAngleLoc), RAngleLoc(RAngleLoc),
61+
NumParams(Params.size()), ContainsUnexpandedParameterPack(false),
6362
HasRequiresClause(RequiresClause != nullptr),
6463
HasConstrainedParameters(false) {
6564
for (unsigned Idx = 0; Idx < NumParams; ++Idx) {
@@ -245,15 +244,15 @@ bool TemplateParameterList::hasAssociatedConstraints() const {
245244
return HasRequiresClause || HasConstrainedParameters;
246245
}
247246

248-
ArrayRef<TemplateArgument> TemplateParameterList::getInjectedTemplateArgs() {
249-
if (const auto *Context = InjectedArgs.dyn_cast<const ASTContext *>()) {
250-
TemplateArgument *Args = new (*Context) TemplateArgument[size()];
251-
llvm::transform(*this, Args, [&](NamedDecl *ND) {
252-
return Context->getInjectedTemplateArg(ND);
247+
ArrayRef<TemplateArgument>
248+
TemplateParameterList::getInjectedTemplateArgs(const ASTContext &Context) {
249+
if (!InjectedArgs) {
250+
InjectedArgs = new (Context) TemplateArgument[size()];
251+
llvm::transform(*this, InjectedArgs, [&](NamedDecl *ND) {
252+
return Context.getInjectedTemplateArg(ND);
253253
});
254-
InjectedArgs = Args;
255254
}
256-
return {InjectedArgs.get<TemplateArgument *>(), NumParams};
255+
return {InjectedArgs, NumParams};
257256
}
258257

259258
bool TemplateParameterList::shouldIncludeTypeForArgument(
@@ -630,7 +629,7 @@ ClassTemplateDecl::getInjectedClassNameSpecialization() {
630629
TemplateName Name = Context.getQualifiedTemplateName(
631630
/*NNS=*/nullptr, /*TemplateKeyword=*/false, TemplateName(this));
632631
CommonPtr->InjectedClassNameType = Context.getTemplateSpecializationType(
633-
Name, getTemplateParameters()->getInjectedTemplateArgs());
632+
Name, getTemplateParameters()->getInjectedTemplateArgs(Context));
634633
return CommonPtr->InjectedClassNameType;
635634
}
636635

clang/lib/Sema/SemaTemplateDeduction.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6163,7 +6163,7 @@ struct TemplateArgumentListAreEqual {
61636163
std::enable_if_t<!std::is_same_v<T1, T2>, bool> = true>
61646164
bool operator()(T1 *Spec, T2 *Primary) {
61656165
ArrayRef<TemplateArgument> Args1 = Spec->getTemplateArgs().asArray(),
6166-
Args2 = Primary->getInjectedTemplateArgs();
6166+
Args2 = Primary->getInjectedTemplateArgs(Ctx);
61676167

61686168
for (unsigned I = 0, E = Args1.size(); I < E; ++I) {
61696169
// We use profile, instead of structural comparison of the arguments,
@@ -6342,7 +6342,7 @@ bool Sema::isMoreSpecializedThanPrimary(
63426342
VarTemplateDecl *Primary = Spec->getSpecializedTemplate();
63436343
TemplateName Name(Primary);
63446344
QualType PrimaryT = Context.getTemplateSpecializationType(
6345-
Name, Primary->getInjectedTemplateArgs());
6345+
Name, Primary->getInjectedTemplateArgs(Context));
63466346
QualType PartialT = Context.getTemplateSpecializationType(
63476347
Name, Spec->getTemplateArgs().asArray());
63486348

@@ -6372,13 +6372,13 @@ bool Sema::isTemplateTemplateParameterAtLeastAsSpecializedAs(
63726372
// - Each function template has a single function parameter whose type is
63736373
// a specialization of X with template arguments corresponding to the
63746374
// template parameters from the respective function template
6375-
SmallVector<TemplateArgument, 8> AArgs(A->getInjectedTemplateArgs());
6375+
SmallVector<TemplateArgument, 8> AArgs(A->getInjectedTemplateArgs(Context));
63766376

63776377
// Check P's arguments against A's parameter list. This will fill in default
63786378
// template arguments as needed. AArgs are already correct by construction.
63796379
// We can't just use CheckTemplateIdType because that will expand alias
63806380
// templates.
6381-
SmallVector<TemplateArgument, 4> PArgs(P->getInjectedTemplateArgs());
6381+
SmallVector<TemplateArgument, 4> PArgs(P->getInjectedTemplateArgs(Context));
63826382
{
63836383
TemplateArgumentListInfo PArgList(P->getLAngleLoc(),
63846384
P->getRAngleLoc());

clang/lib/Sema/SemaTemplateInstantiate.cpp

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,7 @@ struct TemplateInstantiationArgumentCollecter
200200
if (Innermost)
201201
AddInnermostTemplateArguments(FTD);
202202
else if (ForConstraintInstantiation)
203-
AddOuterTemplateArguments(FTD, FTD->getInjectedTemplateArgs(),
203+
AddOuterTemplateArguments(FTD, FTD->getInjectedTemplateArgs(S.Context),
204204
/*Final=*/false);
205205

206206
if (FTD->isMemberSpecialization())
@@ -219,7 +219,7 @@ struct TemplateInstantiationArgumentCollecter
219219
if (Innermost)
220220
AddInnermostTemplateArguments(VTD);
221221
else if (ForConstraintInstantiation)
222-
AddOuterTemplateArguments(VTD, VTD->getInjectedTemplateArgs(),
222+
AddOuterTemplateArguments(VTD, VTD->getInjectedTemplateArgs(S.Context),
223223
/*Final=*/false);
224224

225225
if (VTD->isMemberSpecialization())
@@ -237,7 +237,8 @@ struct TemplateInstantiationArgumentCollecter
237237
if (Innermost)
238238
AddInnermostTemplateArguments(VTPSD);
239239
else if (ForConstraintInstantiation)
240-
AddOuterTemplateArguments(VTPSD, VTPSD->getInjectedTemplateArgs(),
240+
AddOuterTemplateArguments(VTPSD,
241+
VTPSD->getInjectedTemplateArgs(S.Context),
241242
/*Final=*/false);
242243

243244
if (VTPSD->isMemberSpecialization())
@@ -254,7 +255,7 @@ struct TemplateInstantiationArgumentCollecter
254255
if (Innermost)
255256
AddInnermostTemplateArguments(CTD);
256257
else if (ForConstraintInstantiation)
257-
AddOuterTemplateArguments(CTD, CTD->getInjectedTemplateArgs(),
258+
AddOuterTemplateArguments(CTD, CTD->getInjectedTemplateArgs(S.Context),
258259
/*Final=*/false);
259260

260261
if (CTD->isMemberSpecialization())
@@ -274,7 +275,8 @@ struct TemplateInstantiationArgumentCollecter
274275
if (Innermost)
275276
AddInnermostTemplateArguments(CTPSD);
276277
else if (ForConstraintInstantiation)
277-
AddOuterTemplateArguments(CTPSD, CTPSD->getInjectedTemplateArgs(),
278+
AddOuterTemplateArguments(CTPSD,
279+
CTPSD->getInjectedTemplateArgs(S.Context),
278280
/*Final=*/false);
279281

280282
if (CTPSD->isMemberSpecialization())
@@ -290,7 +292,7 @@ struct TemplateInstantiationArgumentCollecter
290292
if (Innermost)
291293
AddInnermostTemplateArguments(TATD);
292294
else if (ForConstraintInstantiation)
293-
AddOuterTemplateArguments(TATD, TATD->getInjectedTemplateArgs(),
295+
AddOuterTemplateArguments(TATD, TATD->getInjectedTemplateArgs(S.Context),
294296
/*Final=*/false);
295297

296298
return UseNextDecl(TATD);

0 commit comments

Comments
 (0)