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

0 commit comments

Comments
 (0)