Skip to content

Commit 2296406

Browse files
committed
[clang] NFCI: use TemplateArgumentLoc for NTTP DefaultArgument
This is an enabler for a future patch.
1 parent b4492c9 commit 2296406

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
@@ -258,7 +258,8 @@ fetchTemplateParameters(const TemplateParameterList *Params,
258258
if (NTTP->hasDefaultArgument()) {
259259
P.Default.emplace();
260260
llvm::raw_string_ostream Out(*P.Default);
261-
NTTP->getDefaultArgument()->printPretty(Out, nullptr, PP);
261+
NTTP->getDefaultArgument().getArgument().print(PP, Out,
262+
/*IncludeType=*/false);
262263
}
263264
} else if (const auto *TTPD = dyn_cast<TemplateTemplateParmDecl>(Param)) {
264265
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
@@ -1365,7 +1365,8 @@ class NonTypeTemplateParmDecl final
13651365

13661366
/// The default template argument, if any, and whether or not
13671367
/// it was inherited.
1368-
using DefArgStorage = DefaultArgStorage<NonTypeTemplateParmDecl, Expr *>;
1368+
using DefArgStorage =
1369+
DefaultArgStorage<NonTypeTemplateParmDecl, TemplateArgumentLoc *>;
13691370
DefArgStorage DefaultArgument;
13701371

13711372
// FIXME: Collapse this into TemplateParamPosition; or, just move depth/index
@@ -1435,7 +1436,10 @@ class NonTypeTemplateParmDecl final
14351436
bool hasDefaultArgument() const { return DefaultArgument.isSet(); }
14361437

14371438
/// Retrieve the default argument, if any.
1438-
Expr *getDefaultArgument() const { return DefaultArgument.get(); }
1439+
const TemplateArgumentLoc &getDefaultArgument() const {
1440+
static const TemplateArgumentLoc NoneLoc;
1441+
return DefaultArgument.isSet() ? *DefaultArgument.get() : NoneLoc;
1442+
}
14391443

14401444
/// Retrieve the location of the default argument, if any.
14411445
SourceLocation getDefaultArgumentLoc() const;
@@ -1449,7 +1453,8 @@ class NonTypeTemplateParmDecl final
14491453
/// Set the default argument for this template parameter, and
14501454
/// whether that default argument was inherited from another
14511455
/// declaration.
1452-
void setDefaultArgument(Expr *DefArg) { DefaultArgument.set(DefArg); }
1456+
void setDefaultArgument(const ASTContext &C,
1457+
const TemplateArgumentLoc &DefArg);
14531458
void setInheritedDefaultArgument(const ASTContext &C,
14541459
NonTypeTemplateParmDecl *Parm) {
14551460
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
@@ -6502,8 +6502,10 @@ bool ASTContext::isSameDefaultTemplateArgument(const NamedDecl *X,
65026502
if (!NTTPX->hasDefaultArgument() || !NTTPY->hasDefaultArgument())
65036503
return false;
65046504

6505-
Expr *DefaultArgumentX = NTTPX->getDefaultArgument()->IgnoreImpCasts();
6506-
Expr *DefaultArgumentY = NTTPY->getDefaultArgument()->IgnoreImpCasts();
6505+
Expr *DefaultArgumentX =
6506+
NTTPX->getDefaultArgument().getArgument().getAsExpr()->IgnoreImpCasts();
6507+
Expr *DefaultArgumentY =
6508+
NTTPY->getDefaultArgument().getArgument().getAsExpr()->IgnoreImpCasts();
65076509
llvm::FoldingSetNodeID XID, YID;
65086510
DefaultArgumentX->Profile(XID, *this, /*Canonical=*/true);
65096511
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
@@ -1897,7 +1897,7 @@ void DeclPrinter::VisitNonTypeTemplateParmDecl(
18971897

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

clang/lib/AST/DeclTemplate.cpp

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -788,14 +788,21 @@ NonTypeTemplateParmDecl::CreateDeserialized(ASTContext &C, GlobalDeclID ID,
788788
SourceRange NonTypeTemplateParmDecl::getSourceRange() const {
789789
if (hasDefaultArgument() && !defaultArgumentWasInherited())
790790
return SourceRange(getOuterLocStart(),
791-
getDefaultArgument()->getSourceRange().getEnd());
791+
getDefaultArgument().getSourceRange().getEnd());
792792
return DeclaratorDecl::getSourceRange();
793793
}
794794

795795
SourceLocation NonTypeTemplateParmDecl::getDefaultArgumentLoc() const {
796-
return hasDefaultArgument()
797-
? getDefaultArgument()->getSourceRange().getBegin()
798-
: SourceLocation();
796+
return hasDefaultArgument() ? getDefaultArgument().getSourceRange().getBegin()
797+
: SourceLocation();
798+
}
799+
800+
void NonTypeTemplateParmDecl::setDefaultArgument(
801+
const ASTContext &C, const TemplateArgumentLoc &DefArg) {
802+
if (DefArg.getArgument().isNull())
803+
DefaultArgument.set(nullptr);
804+
else
805+
DefaultArgument.set(new (C) TemplateArgumentLoc(DefArg));
799806
}
800807

801808
//===----------------------------------------------------------------------===//

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
@@ -1521,8 +1521,11 @@ bool ODRDiagsEmitter::diagnoseMismatch(
15211521
}
15221522

15231523
if (HasFirstDefaultArgument && HasSecondDefaultArgument) {
1524-
Expr *FirstDefaultArgument = FirstNTTPD->getDefaultArgument();
1525-
Expr *SecondDefaultArgument = SecondNTTPD->getDefaultArgument();
1524+
TemplateArgument FirstDefaultArgument =
1525+
FirstNTTPD->getDefaultArgument().getArgument();
1526+
TemplateArgument SecondDefaultArgument =
1527+
SecondNTTPD->getDefaultArgument().getArgument();
1528+
15261529
if (computeODRHash(FirstDefaultArgument) !=
15271530
computeODRHash(SecondDefaultArgument)) {
15281531
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
@@ -710,7 +710,8 @@ class IndexingDeclVisitor : public ConstDeclVisitor<IndexingDeclVisitor, bool> {
710710
} else if (const auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(TP)) {
711711
IndexCtx.indexTypeSourceInfo(NTTP->getTypeSourceInfo(), Parent);
712712
if (NTTP->hasDefaultArgument())
713-
IndexCtx.indexBody(NTTP->getDefaultArgument(), Parent);
713+
handleTemplateArgumentLoc(NTTP->getDefaultArgument(), Parent,
714+
TP->getLexicalDeclContext());
714715
} else if (const auto *TTPD = dyn_cast<TemplateTemplateParmDecl>(TP)) {
715716
if (TTPD->hasDefaultArgument())
716717
handleTemplateArgumentLoc(TTPD->getDefaultArgument(), Parent,

clang/lib/Sema/HLSLExternalSemaSource.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -434,10 +434,12 @@ void HLSLExternalSemaSource::defineHLSLVectorAlias() {
434434
AST, HLSLNamespace, SourceLocation(), SourceLocation(), 0, 1,
435435
&AST.Idents.get("element_count", tok::TokenKind::identifier), AST.IntTy,
436436
false, AST.getTrivialTypeSourceInfo(AST.IntTy));
437-
Expr *LiteralExpr =
438-
IntegerLiteral::Create(AST, llvm::APInt(AST.getIntWidth(AST.IntTy), 4),
439-
AST.IntTy, SourceLocation());
440-
SizeParam->setDefaultArgument(LiteralExpr);
437+
llvm::APInt Val(AST.getIntWidth(AST.IntTy), 4);
438+
TemplateArgument Default(AST, llvm::APSInt(std::move(Val)), AST.IntTy,
439+
/*IsDefaulted=*/true);
440+
SizeParam->setDefaultArgument(
441+
AST, SemaPtr->getTrivialTemplateArgumentLoc(Default, AST.IntTy,
442+
SourceLocation(), SizeParam));
441443
TemplateParams.emplace_back(SizeParam);
442444

443445
auto *ParamList =

clang/lib/Sema/SemaTemplate.cpp

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

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

16041606
return Param;
@@ -3627,9 +3629,9 @@ bool Sema::CheckTemplateParameterList(TemplateParameterList *NewParams,
36273629

36283630
// Check the presence of a default argument here.
36293631
if (NewNonTypeParm->hasDefaultArgument() &&
3630-
DiagnoseDefaultTemplateArgument(*this, TPC,
3631-
NewNonTypeParm->getLocation(),
3632-
NewNonTypeParm->getDefaultArgument()->getSourceRange())) {
3632+
DiagnoseDefaultTemplateArgument(
3633+
*this, TPC, NewNonTypeParm->getLocation(),
3634+
NewNonTypeParm->getDefaultArgument().getSourceRange())) {
36333635
NewNonTypeParm->removeDefaultArgument();
36343636
}
36353637

@@ -6098,16 +6100,17 @@ static TypeSourceInfo *SubstDefaultTemplateArgument(
60986100
/// parameters that precede \p Param in the template parameter list.
60996101
///
61006102
/// \returns the substituted template argument, or NULL if an error occurred.
6101-
static ExprResult SubstDefaultTemplateArgument(
6103+
static bool SubstDefaultTemplateArgument(
61026104
Sema &SemaRef, TemplateDecl *Template, SourceLocation TemplateLoc,
61036105
SourceLocation RAngleLoc, NonTypeTemplateParmDecl *Param,
61046106
ArrayRef<TemplateArgument> SugaredConverted,
6105-
ArrayRef<TemplateArgument> CanonicalConverted) {
6107+
ArrayRef<TemplateArgument> CanonicalConverted,
6108+
TemplateArgumentLoc &Output) {
61066109
Sema::InstantiatingTemplate Inst(SemaRef, TemplateLoc, Param, Template,
61076110
SugaredConverted,
61086111
SourceRange(TemplateLoc, RAngleLoc));
61096112
if (Inst.isInvalid())
6110-
return ExprError();
6113+
return true;
61116114

61126115
// Only substitute for the innermost template argument list.
61136116
MultiLevelTemplateArgumentList TemplateArgLists(Template, SugaredConverted,
@@ -6118,7 +6121,8 @@ static ExprResult SubstDefaultTemplateArgument(
61186121
Sema::ContextRAII SavedContext(SemaRef, Template->getDeclContext());
61196122
EnterExpressionEvaluationContext ConstantEvaluated(
61206123
SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
6121-
return SemaRef.SubstExpr(Param->getDefaultArgument(), TemplateArgLists);
6124+
return SemaRef.SubstTemplateArgument(Param->getDefaultArgument(),
6125+
TemplateArgLists, Output);
61226126
}
61236127

61246128
/// Substitute template arguments into the default template argument for
@@ -6211,14 +6215,12 @@ TemplateArgumentLoc Sema::SubstDefaultTemplateArgumentIfAvailable(
62116215
return TemplateArgumentLoc();
62126216

62136217
HasDefaultArg = true;
6214-
ExprResult Arg = SubstDefaultTemplateArgument(
6215-
*this, Template, TemplateLoc, RAngleLoc, NonTypeParm, SugaredConverted,
6216-
CanonicalConverted);
6217-
if (Arg.isInvalid())
6218+
TemplateArgumentLoc Output;
6219+
if (SubstDefaultTemplateArgument(*this, Template, TemplateLoc, RAngleLoc,
6220+
NonTypeParm, SugaredConverted,
6221+
CanonicalConverted, Output))
62186222
return TemplateArgumentLoc();
6219-
6220-
Expr *ArgE = Arg.getAs<Expr>();
6221-
return TemplateArgumentLoc(TemplateArgument(ArgE), ArgE);
6223+
return Output;
62226224
}
62236225

62246226
TemplateTemplateParmDecl *TempTempParm
@@ -6799,14 +6801,10 @@ bool Sema::CheckTemplateArgumentList(
67996801
return diagnoseMissingArgument(*this, TemplateLoc, Template, NTTP,
68006802
NewArgs);
68016803

6802-
ExprResult E = SubstDefaultTemplateArgument(
6803-
*this, Template, TemplateLoc, RAngleLoc, NTTP, SugaredConverted,
6804-
CanonicalConverted);
6805-
if (E.isInvalid())
6804+
if (SubstDefaultTemplateArgument(*this, Template, TemplateLoc, RAngleLoc,
6805+
NTTP, SugaredConverted,
6806+
CanonicalConverted, Arg))
68066807
return true;
6807-
6808-
Expr *Ex = E.getAs<Expr>();
6809-
Arg = TemplateArgumentLoc(TemplateArgument(Ex), Ex);
68106808
} else {
68116809
TemplateTemplateParmDecl *TempParm
68126810
= cast<TemplateTemplateParmDecl>(*Param);
@@ -9520,10 +9518,10 @@ DeclResult Sema::ActOnClassTemplateSpecialization(
95209518
}
95219519
} else if (NonTypeTemplateParmDecl *NTTP
95229520
= dyn_cast<NonTypeTemplateParmDecl>(Param)) {
9523-
if (Expr *DefArg = NTTP->getDefaultArgument()) {
9521+
if (NTTP->hasDefaultArgument()) {
95249522
Diag(NTTP->getDefaultArgumentLoc(),
95259523
diag::err_default_arg_in_partial_spec)
9526-
<< DefArg->getSourceRange();
9524+
<< NTTP->getDefaultArgument().getSourceRange();
95279525
NTTP->removeDefaultArgument();
95289526
}
95299527
} else {

clang/lib/Sema/SemaTemplateDeduction.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -540,14 +540,14 @@ static NamedDecl *getTemplateParameterWithDefault(Sema &S, NamedDecl *A,
540540
}
541541
case Decl::NonTypeTemplateParm: {
542542
auto *T = cast<NonTypeTemplateParmDecl>(A);
543-
// FIXME: Ditto, as above for TemplateTypeParm case.
544-
if (T->isParameterPack())
545-
return A;
546543
auto *R = NonTypeTemplateParmDecl::Create(
547544
S.Context, A->getDeclContext(), SourceLocation(), SourceLocation(),
548545
T->getDepth(), T->getIndex(), T->getIdentifier(), T->getType(),
549-
/*ParameterPack=*/false, T->getTypeSourceInfo());
550-
R->setDefaultArgument(Default.getAsExpr());
546+
T->isParameterPack(), T->getTypeSourceInfo());
547+
R->setDefaultArgument(S.Context,
548+
S.getTrivialTemplateArgumentLoc(
549+
Default, Default.getNonTypeTemplateArgumentType(),
550+
SourceLocation()));
551551
if (auto *PTC = T->getPlaceholderTypeConstraint())
552552
R->setPlaceholderTypeConstraint(PTC);
553553
return R;

clang/lib/Sema/SemaTemplateInstantiateDecl.cpp

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

31323133
// 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
@@ -2716,7 +2716,8 @@ void ASTDeclReader::VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D) {
27162716
// Rest of NonTypeTemplateParmDecl.
27172717
D->ParameterPack = Record.readInt();
27182718
if (Record.readInt())
2719-
D->setDefaultArgument(Record.readExpr());
2719+
D->setDefaultArgument(Reader.getContext(),
2720+
Record.readTemplateArgumentLoc());
27202721
}
27212722
}
27222723

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)