Skip to content

Commit 2bde13c

Browse files
authored
[clang] NFCI: use TemplateArgumentLoc for NTTP DefaultArgument (#92852)
This is an enabler for #92855 This allows an NTTP default argument to be set as an arbitrary TemplateArgument, not just an expression. This allows template parameter packs to have default arguments in the AST, even though the language proper doesn't support the syntax for it. This allows NTTP default arguments to be other kinds of arguments, like packs, integral constants, and such.
1 parent 30d484f commit 2bde13c

25 files changed

+99
-74
lines changed

clang-tools-extra/clangd/Hover.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -262,7 +262,8 @@ fetchTemplateParameters(const TemplateParameterList *Params,
262262
if (NTTP->hasDefaultArgument()) {
263263
P.Default.emplace();
264264
llvm::raw_string_ostream Out(*P.Default);
265-
NTTP->getDefaultArgument()->printPretty(Out, nullptr, PP);
265+
NTTP->getDefaultArgument().getArgument().print(PP, Out,
266+
/*IncludeType=*/false);
266267
}
267268
} else if (const auto *TTPD = dyn_cast<TemplateTemplateParmDecl>(Param)) {
268269
P.Type = printType(TTPD, PP);

clang/include/clang/AST/ASTNodeTraverser.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -704,9 +704,9 @@ class ASTNodeTraverser
704704
if (const auto *E = D->getPlaceholderTypeConstraint())
705705
Visit(E);
706706
if (D->hasDefaultArgument())
707-
Visit(D->getDefaultArgument(), SourceRange(),
708-
D->getDefaultArgStorage().getInheritedFrom(),
709-
D->defaultArgumentWasInherited() ? "inherited from" : "previous");
707+
dumpTemplateArgumentLoc(
708+
D->getDefaultArgument(), D->getDefaultArgStorage().getInheritedFrom(),
709+
D->defaultArgumentWasInherited() ? "inherited from" : "previous");
710710
}
711711

712712
void VisitTemplateTemplateParmDecl(const TemplateTemplateParmDecl *D) {

clang/include/clang/AST/DeclTemplate.h

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1360,7 +1360,8 @@ class NonTypeTemplateParmDecl final
13601360

13611361
/// The default template argument, if any, and whether or not
13621362
/// it was inherited.
1363-
using DefArgStorage = DefaultArgStorage<NonTypeTemplateParmDecl, Expr *>;
1363+
using DefArgStorage =
1364+
DefaultArgStorage<NonTypeTemplateParmDecl, TemplateArgumentLoc *>;
13641365
DefArgStorage DefaultArgument;
13651366

13661367
// FIXME: Collapse this into TemplateParamPosition; or, just move depth/index
@@ -1430,7 +1431,10 @@ class NonTypeTemplateParmDecl final
14301431
bool hasDefaultArgument() const { return DefaultArgument.isSet(); }
14311432

14321433
/// Retrieve the default argument, if any.
1433-
Expr *getDefaultArgument() const { return DefaultArgument.get(); }
1434+
const TemplateArgumentLoc &getDefaultArgument() const {
1435+
static const TemplateArgumentLoc NoneLoc;
1436+
return DefaultArgument.isSet() ? *DefaultArgument.get() : NoneLoc;
1437+
}
14341438

14351439
/// Retrieve the location of the default argument, if any.
14361440
SourceLocation getDefaultArgumentLoc() const;
@@ -1444,7 +1448,8 @@ class NonTypeTemplateParmDecl final
14441448
/// Set the default argument for this template parameter, and
14451449
/// whether that default argument was inherited from another
14461450
/// declaration.
1447-
void setDefaultArgument(Expr *DefArg) { DefaultArgument.set(DefArg); }
1451+
void setDefaultArgument(const ASTContext &C,
1452+
const TemplateArgumentLoc &DefArg);
14481453
void setInheritedDefaultArgument(const ASTContext &C,
14491454
NonTypeTemplateParmDecl *Parm) {
14501455
DefaultArgument.setInherited(C, Parm);

clang/include/clang/AST/RecursiveASTVisitor.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2320,7 +2320,7 @@ DEF_TRAVERSE_DECL(NonTypeTemplateParmDecl, {
23202320
// A non-type template parameter, e.g. "S" in template<int S> class Foo ...
23212321
TRY_TO(TraverseDeclaratorHelper(D));
23222322
if (D->hasDefaultArgument() && !D->defaultArgumentWasInherited())
2323-
TRY_TO(TraverseStmt(D->getDefaultArgument()));
2323+
TRY_TO(TraverseTemplateArgumentLoc(D->getDefaultArgument()));
23242324
})
23252325

23262326
DEF_TRAVERSE_DECL(ParmVarDecl, {

clang/lib/AST/ASTContext.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6503,8 +6503,10 @@ bool ASTContext::isSameDefaultTemplateArgument(const NamedDecl *X,
65036503
if (!NTTPX->hasDefaultArgument() || !NTTPY->hasDefaultArgument())
65046504
return false;
65056505

6506-
Expr *DefaultArgumentX = NTTPX->getDefaultArgument()->IgnoreImpCasts();
6507-
Expr *DefaultArgumentY = NTTPY->getDefaultArgument()->IgnoreImpCasts();
6506+
Expr *DefaultArgumentX =
6507+
NTTPX->getDefaultArgument().getArgument().getAsExpr()->IgnoreImpCasts();
6508+
Expr *DefaultArgumentY =
6509+
NTTPY->getDefaultArgument().getArgument().getAsExpr()->IgnoreImpCasts();
65086510
llvm::FoldingSetNodeID XID, YID;
65096511
DefaultArgumentX->Profile(XID, *this, /*Canonical=*/true);
65106512
DefaultArgumentY->Profile(YID, *this, /*Canonical=*/true);

clang/lib/AST/ASTDiagnostic.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1238,7 +1238,7 @@ class TemplateDiff {
12381238
E = Iter->getAsExpr();
12391239
}
12401240
} else if (!Default->isParameterPack()) {
1241-
E = Default->getDefaultArgument();
1241+
E = Default->getDefaultArgument().getArgument().getAsExpr();
12421242
}
12431243

12441244
if (!Iter.hasDesugaredTA()) return;

clang/lib/AST/ASTImporter.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5949,10 +5949,11 @@ ASTNodeImporter::VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D) {
59495949
return ToD;
59505950

59515951
if (D->hasDefaultArgument()) {
5952-
ExpectedExpr ToDefaultArgOrErr = import(D->getDefaultArgument());
5952+
Expected<TemplateArgumentLoc> ToDefaultArgOrErr =
5953+
import(D->getDefaultArgument());
59535954
if (!ToDefaultArgOrErr)
59545955
return ToDefaultArgOrErr.takeError();
5955-
ToD->setDefaultArgument(*ToDefaultArgOrErr);
5956+
ToD->setDefaultArgument(Importer.getToContext(), *ToDefaultArgOrErr);
59565957
}
59575958

59585959
return ToD;

clang/lib/AST/DeclPrinter.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1898,7 +1898,7 @@ void DeclPrinter::VisitNonTypeTemplateParmDecl(
18981898

18991899
if (NTTP->hasDefaultArgument()) {
19001900
Out << " = ";
1901-
NTTP->getDefaultArgument()->printPretty(Out, nullptr, Policy, Indentation,
1902-
"\n", &Context);
1901+
NTTP->getDefaultArgument().getArgument().print(Policy, Out,
1902+
/*IncludeType=*/false);
19031903
}
19041904
}

clang/lib/AST/DeclTemplate.cpp

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -795,14 +795,21 @@ NonTypeTemplateParmDecl::CreateDeserialized(ASTContext &C, GlobalDeclID ID,
795795
SourceRange NonTypeTemplateParmDecl::getSourceRange() const {
796796
if (hasDefaultArgument() && !defaultArgumentWasInherited())
797797
return SourceRange(getOuterLocStart(),
798-
getDefaultArgument()->getSourceRange().getEnd());
798+
getDefaultArgument().getSourceRange().getEnd());
799799
return DeclaratorDecl::getSourceRange();
800800
}
801801

802802
SourceLocation NonTypeTemplateParmDecl::getDefaultArgumentLoc() const {
803-
return hasDefaultArgument()
804-
? getDefaultArgument()->getSourceRange().getBegin()
805-
: SourceLocation();
803+
return hasDefaultArgument() ? getDefaultArgument().getSourceRange().getBegin()
804+
: SourceLocation();
805+
}
806+
807+
void NonTypeTemplateParmDecl::setDefaultArgument(
808+
const ASTContext &C, const TemplateArgumentLoc &DefArg) {
809+
if (DefArg.getArgument().isNull())
810+
DefaultArgument.set(nullptr);
811+
else
812+
DefaultArgument.set(new (C) TemplateArgumentLoc(DefArg));
806813
}
807814

808815
//===----------------------------------------------------------------------===//

clang/lib/AST/JSONNodeDumper.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1044,7 +1044,7 @@ void JSONNodeDumper::VisitNonTypeTemplateParmDecl(
10441044

10451045
if (D->hasDefaultArgument())
10461046
JOS.attributeObject("defaultArg", [=] {
1047-
Visit(D->getDefaultArgument(), SourceRange(),
1047+
Visit(D->getDefaultArgument().getArgument(), SourceRange(),
10481048
D->getDefaultArgStorage().getInheritedFrom(),
10491049
D->defaultArgumentWasInherited() ? "inherited from" : "previous");
10501050
});

clang/lib/AST/ODRDiagsEmitter.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1523,8 +1523,11 @@ bool ODRDiagsEmitter::diagnoseMismatch(
15231523
}
15241524

15251525
if (HasFirstDefaultArgument && HasSecondDefaultArgument) {
1526-
Expr *FirstDefaultArgument = FirstNTTPD->getDefaultArgument();
1527-
Expr *SecondDefaultArgument = SecondNTTPD->getDefaultArgument();
1526+
TemplateArgument FirstDefaultArgument =
1527+
FirstNTTPD->getDefaultArgument().getArgument();
1528+
TemplateArgument SecondDefaultArgument =
1529+
SecondNTTPD->getDefaultArgument().getArgument();
1530+
15281531
if (computeODRHash(FirstDefaultArgument) !=
15291532
computeODRHash(SecondDefaultArgument)) {
15301533
DiagTemplateError(FunctionTemplateParameterDifferentDefaultArgument)

clang/lib/AST/ODRHash.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -480,7 +480,7 @@ class ODRDeclVisitor : public ConstDeclVisitor<ODRDeclVisitor> {
480480
D->hasDefaultArgument() && !D->defaultArgumentWasInherited();
481481
Hash.AddBoolean(hasDefaultArgument);
482482
if (hasDefaultArgument) {
483-
AddStmt(D->getDefaultArgument());
483+
AddTemplateArgument(D->getDefaultArgument().getArgument());
484484
}
485485
Hash.AddBoolean(D->isParameterPack());
486486

clang/lib/AST/TypePrinter.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2281,8 +2281,9 @@ bool clang::isSubstitutedDefaultArgument(ASTContext &Ctx, TemplateArgument Arg,
22812281
Ctx, Arg, TTPD->getDefaultArgument().getArgument(), Args, Depth);
22822282
} else if (auto *NTTPD = dyn_cast<NonTypeTemplateParmDecl>(Param)) {
22832283
return NTTPD->hasDefaultArgument() &&
2284-
isSubstitutedTemplateArgument(Ctx, Arg, NTTPD->getDefaultArgument(),
2285-
Args, Depth);
2284+
isSubstitutedTemplateArgument(
2285+
Ctx, Arg, NTTPD->getDefaultArgument().getArgument(), Args,
2286+
Depth);
22862287
}
22872288
return false;
22882289
}

clang/lib/ExtractAPI/DeclarationFragments.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1023,8 +1023,9 @@ DeclarationFragmentsBuilder::getFragmentsForTemplateParameters(
10231023
if (NTP->hasDefaultArgument()) {
10241024
SmallString<8> ExprStr;
10251025
raw_svector_ostream Output(ExprStr);
1026-
NTP->getDefaultArgument()->printPretty(
1027-
Output, nullptr, NTP->getASTContext().getPrintingPolicy());
1026+
NTP->getDefaultArgument().getArgument().print(
1027+
NTP->getASTContext().getPrintingPolicy(), Output,
1028+
/*IncludeType=*/false);
10281029
Fragments.append(" = ", DeclarationFragments::FragmentKind::Text)
10291030
.append(ExprStr, DeclarationFragments::FragmentKind::Text);
10301031
}

clang/lib/Index/IndexDecl.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -711,7 +711,8 @@ class IndexingDeclVisitor : public ConstDeclVisitor<IndexingDeclVisitor, bool> {
711711
} else if (const auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(TP)) {
712712
IndexCtx.indexTypeSourceInfo(NTTP->getTypeSourceInfo(), Parent);
713713
if (NTTP->hasDefaultArgument())
714-
IndexCtx.indexBody(NTTP->getDefaultArgument(), Parent);
714+
handleTemplateArgumentLoc(NTTP->getDefaultArgument(), Parent,
715+
TP->getLexicalDeclContext());
715716
} else if (const auto *TTPD = dyn_cast<TemplateTemplateParmDecl>(TP)) {
716717
if (TTPD->hasDefaultArgument())
717718
handleTemplateArgumentLoc(TTPD->getDefaultArgument(), Parent,

clang/lib/Sema/HLSLExternalSemaSource.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -442,10 +442,12 @@ void HLSLExternalSemaSource::defineHLSLVectorAlias() {
442442
AST, HLSLNamespace, SourceLocation(), SourceLocation(), 0, 1,
443443
&AST.Idents.get("element_count", tok::TokenKind::identifier), AST.IntTy,
444444
false, AST.getTrivialTypeSourceInfo(AST.IntTy));
445-
Expr *LiteralExpr =
446-
IntegerLiteral::Create(AST, llvm::APInt(AST.getIntWidth(AST.IntTy), 4),
447-
AST.IntTy, SourceLocation());
448-
SizeParam->setDefaultArgument(LiteralExpr);
445+
llvm::APInt Val(AST.getIntWidth(AST.IntTy), 4);
446+
TemplateArgument Default(AST, llvm::APSInt(std::move(Val)), AST.IntTy,
447+
/*IsDefaulted=*/true);
448+
SizeParam->setDefaultArgument(
449+
AST, SemaPtr->getTrivialTemplateArgumentLoc(Default, AST.IntTy,
450+
SourceLocation(), SizeParam));
449451
TemplateParams.emplace_back(SizeParam);
450452

451453
auto *ParamList =

clang/lib/Sema/SemaTemplate.cpp

Lines changed: 22 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1599,7 +1599,9 @@ NamedDecl *Sema::ActOnNonTypeTemplateParameter(Scope *S, Declarator &D,
15991599
if (DiagnoseUnexpandedParameterPack(Default, UPPC_DefaultArgument))
16001600
return Param;
16011601

1602-
Param->setDefaultArgument(Default);
1602+
Param->setDefaultArgument(
1603+
Context, getTrivialTemplateArgumentLoc(TemplateArgument(Default),
1604+
QualType(), SourceLocation()));
16031605
}
16041606

16051607
return Param;
@@ -3630,9 +3632,9 @@ bool Sema::CheckTemplateParameterList(TemplateParameterList *NewParams,
36303632

36313633
// Check the presence of a default argument here.
36323634
if (NewNonTypeParm->hasDefaultArgument() &&
3633-
DiagnoseDefaultTemplateArgument(*this, TPC,
3634-
NewNonTypeParm->getLocation(),
3635-
NewNonTypeParm->getDefaultArgument()->getSourceRange())) {
3635+
DiagnoseDefaultTemplateArgument(
3636+
*this, TPC, NewNonTypeParm->getLocation(),
3637+
NewNonTypeParm->getDefaultArgument().getSourceRange())) {
36363638
NewNonTypeParm->removeDefaultArgument();
36373639
}
36383640

@@ -6107,16 +6109,17 @@ static bool SubstDefaultTemplateArgument(
61076109
/// parameters that precede \p Param in the template parameter list.
61086110
///
61096111
/// \returns the substituted template argument, or NULL if an error occurred.
6110-
static ExprResult SubstDefaultTemplateArgument(
6112+
static bool SubstDefaultTemplateArgument(
61116113
Sema &SemaRef, TemplateDecl *Template, SourceLocation TemplateLoc,
61126114
SourceLocation RAngleLoc, NonTypeTemplateParmDecl *Param,
61136115
ArrayRef<TemplateArgument> SugaredConverted,
6114-
ArrayRef<TemplateArgument> CanonicalConverted) {
6116+
ArrayRef<TemplateArgument> CanonicalConverted,
6117+
TemplateArgumentLoc &Output) {
61156118
Sema::InstantiatingTemplate Inst(SemaRef, TemplateLoc, Param, Template,
61166119
SugaredConverted,
61176120
SourceRange(TemplateLoc, RAngleLoc));
61186121
if (Inst.isInvalid())
6119-
return ExprError();
6122+
return true;
61206123

61216124
// Only substitute for the innermost template argument list.
61226125
MultiLevelTemplateArgumentList TemplateArgLists(Template, SugaredConverted,
@@ -6127,7 +6130,8 @@ static ExprResult SubstDefaultTemplateArgument(
61276130
Sema::ContextRAII SavedContext(SemaRef, Template->getDeclContext());
61286131
EnterExpressionEvaluationContext ConstantEvaluated(
61296132
SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
6130-
return SemaRef.SubstExpr(Param->getDefaultArgument(), TemplateArgLists);
6133+
return SemaRef.SubstTemplateArgument(Param->getDefaultArgument(),
6134+
TemplateArgLists, Output);
61316135
}
61326136

61336137
/// Substitute template arguments into the default template argument for
@@ -6219,14 +6223,12 @@ TemplateArgumentLoc Sema::SubstDefaultTemplateArgumentIfAvailable(
62196223
return TemplateArgumentLoc();
62206224

62216225
HasDefaultArg = true;
6222-
ExprResult Arg = SubstDefaultTemplateArgument(
6223-
*this, Template, TemplateLoc, RAngleLoc, NonTypeParm, SugaredConverted,
6224-
CanonicalConverted);
6225-
if (Arg.isInvalid())
6226+
TemplateArgumentLoc Output;
6227+
if (SubstDefaultTemplateArgument(*this, Template, TemplateLoc, RAngleLoc,
6228+
NonTypeParm, SugaredConverted,
6229+
CanonicalConverted, Output))
62266230
return TemplateArgumentLoc();
6227-
6228-
Expr *ArgE = Arg.getAs<Expr>();
6229-
return TemplateArgumentLoc(TemplateArgument(ArgE), ArgE);
6231+
return Output;
62306232
}
62316233

62326234
TemplateTemplateParmDecl *TempTempParm
@@ -6803,14 +6805,10 @@ bool Sema::CheckTemplateArgumentList(
68036805
return diagnoseMissingArgument(*this, TemplateLoc, Template, NTTP,
68046806
NewArgs);
68056807

6806-
ExprResult E = SubstDefaultTemplateArgument(
6807-
*this, Template, TemplateLoc, RAngleLoc, NTTP, SugaredConverted,
6808-
CanonicalConverted);
6809-
if (E.isInvalid())
6808+
if (SubstDefaultTemplateArgument(*this, Template, TemplateLoc, RAngleLoc,
6809+
NTTP, SugaredConverted,
6810+
CanonicalConverted, Arg))
68106811
return true;
6811-
6812-
Expr *Ex = E.getAs<Expr>();
6813-
Arg = TemplateArgumentLoc(TemplateArgument(Ex), Ex);
68146812
} else {
68156813
TemplateTemplateParmDecl *TempParm
68166814
= cast<TemplateTemplateParmDecl>(*Param);
@@ -9523,10 +9521,10 @@ DeclResult Sema::ActOnClassTemplateSpecialization(
95239521
}
95249522
} else if (NonTypeTemplateParmDecl *NTTP
95259523
= dyn_cast<NonTypeTemplateParmDecl>(Param)) {
9526-
if (Expr *DefArg = NTTP->getDefaultArgument()) {
9524+
if (NTTP->hasDefaultArgument()) {
95279525
Diag(NTTP->getDefaultArgumentLoc(),
95289526
diag::err_default_arg_in_partial_spec)
9529-
<< DefArg->getSourceRange();
9527+
<< NTTP->getDefaultArgument().getSourceRange();
95309528
NTTP->removeDefaultArgument();
95319529
}
95329530
} else {

clang/lib/Sema/SemaTemplateDeduction.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -536,14 +536,14 @@ static NamedDecl *getTemplateParameterWithDefault(Sema &S, NamedDecl *A,
536536
}
537537
case Decl::NonTypeTemplateParm: {
538538
auto *T = cast<NonTypeTemplateParmDecl>(A);
539-
// FIXME: Ditto, as above for TemplateTypeParm case.
540-
if (T->isParameterPack())
541-
return A;
542539
auto *R = NonTypeTemplateParmDecl::Create(
543540
S.Context, A->getDeclContext(), SourceLocation(), SourceLocation(),
544541
T->getDepth(), T->getIndex(), T->getIdentifier(), T->getType(),
545-
/*ParameterPack=*/false, T->getTypeSourceInfo());
546-
R->setDefaultArgument(Default.getAsExpr());
542+
T->isParameterPack(), T->getTypeSourceInfo());
543+
R->setDefaultArgument(S.Context,
544+
S.getTrivialTemplateArgumentLoc(
545+
Default, Default.getNonTypeTemplateArgumentType(),
546+
SourceLocation()));
547547
if (auto *PTC = T->getPlaceholderTypeConstraint())
548548
R->setPlaceholderTypeConstraint(PTC);
549549
return R;

clang/lib/Sema/SemaTemplateInstantiateDecl.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3123,9 +3123,10 @@ Decl *TemplateDeclInstantiator::VisitNonTypeTemplateParmDecl(
31233123
if (D->hasDefaultArgument() && !D->defaultArgumentWasInherited()) {
31243124
EnterExpressionEvaluationContext ConstantEvaluated(
31253125
SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
3126-
ExprResult Value = SemaRef.SubstExpr(D->getDefaultArgument(), TemplateArgs);
3127-
if (!Value.isInvalid())
3128-
Param->setDefaultArgument(Value.get());
3126+
TemplateArgumentLoc Result;
3127+
if (!SemaRef.SubstTemplateArgument(D->getDefaultArgument(), TemplateArgs,
3128+
Result))
3129+
Param->setDefaultArgument(SemaRef.Context, Result);
31293130
}
31303131

31313132
// Introduce this template parameter's instantiation into the instantiation

clang/lib/Serialization/ASTReaderDecl.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2717,7 +2717,8 @@ void ASTDeclReader::VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D) {
27172717
// Rest of NonTypeTemplateParmDecl.
27182718
D->ParameterPack = Record.readInt();
27192719
if (Record.readInt())
2720-
D->setDefaultArgument(Record.readExpr());
2720+
D->setDefaultArgument(Reader.getContext(),
2721+
Record.readTemplateArgumentLoc());
27212722
}
27222723
}
27232724

clang/lib/Serialization/ASTWriterDecl.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1941,7 +1941,7 @@ void ASTDeclWriter::VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D) {
19411941
!D->defaultArgumentWasInherited();
19421942
Record.push_back(OwnsDefaultArg);
19431943
if (OwnsDefaultArg)
1944-
Record.AddStmt(D->getDefaultArgument());
1944+
Record.AddTemplateArgumentLoc(D->getDefaultArgument());
19451945
Code = serialization::DECL_NON_TYPE_TEMPLATE_PARM;
19461946
}
19471947
}

clang/test/AST/ast-dump-decl.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -459,7 +459,7 @@ namespace testClassTemplateDecl {
459459

460460
// CHECK: ClassTemplateDecl 0x{{.+}} <{{.+}}:[[@LINE-148]]:3, col:31> col:31 TestTemplateDefaultNonType{{$}}
461461
// CHECK-NEXT: |-NonTypeTemplateParmDecl 0x{{.+}} <col:12, col:20> col:16 'int' depth 0 index 0 I{{$}}
462-
// CHECK-NEXT: | `-TemplateArgument expr{{$}}
462+
// CHECK-NEXT: | `-TemplateArgument <col:20> expr{{$}}
463463
// CHECK-NEXT: | `-IntegerLiteral 0x{{.+}} <col:20> 'int' 42{{$}}
464464
// CHECK-NEXT: `-CXXRecordDecl 0x{{.+}} <col:24, col:31> col:31 struct TestTemplateDefaultNonType{{$}}
465465

@@ -671,7 +671,7 @@ namespace TestNonTypeTemplateParmDecl {
671671
// CHECK: NamespaceDecl{{.*}} TestNonTypeTemplateParmDecl
672672
// CHECK-NEXT: FunctionTemplateDecl
673673
// CHECK-NEXT: NonTypeTemplateParmDecl{{.*}} 'int' depth 0 index 0 I
674-
// CHECK-NEXT: TemplateArgument expr
674+
// CHECK-NEXT: TemplateArgument {{.*}} expr
675675
// CHECK-NEXT: IntegerLiteral{{.*}} 'int' 1
676676
// CHECK-NEXT: NonTypeTemplateParmDecl{{.*}} 'int' depth 0 index 1 ... J
677677

0 commit comments

Comments
 (0)