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
});

0 commit comments

Comments
 (0)