Skip to content

Commit 229cb63

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

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)