Skip to content

Commit 142c3f3

Browse files
committed
[clang] NFCI: use TemplateArgumentLoc for type-param DefaultArgument
This is an enabler for a future patch.
1 parent 32c9d5e commit 142c3f3

27 files changed

+144
-127
lines changed

clang-tools-extra/clang-tidy/bugprone/ForwardingReferenceOverloadCheck.cpp

+3-1
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,9 @@ AST_MATCHER(QualType, isEnableIf) {
5454
AST_MATCHER_P(TemplateTypeParmDecl, hasDefaultArgument,
5555
clang::ast_matchers::internal::Matcher<QualType>, TypeMatcher) {
5656
return Node.hasDefaultArgument() &&
57-
TypeMatcher.matches(Node.getDefaultArgument(), Finder, Builder);
57+
TypeMatcher.matches(
58+
Node.getDefaultArgument().getArgument().getAsType(), Finder,
59+
Builder);
5860
}
5961
AST_MATCHER(TemplateDecl, hasAssociatedConstraints) {
6062
return Node.hasAssociatedConstraints();

clang-tools-extra/clang-tidy/bugprone/IncorrectEnableIfCheck.cpp

+3-2
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,11 @@ namespace {
1919
AST_MATCHER_P(TemplateTypeParmDecl, hasUnnamedDefaultArgument,
2020
ast_matchers::internal::Matcher<TypeLoc>, InnerMatcher) {
2121
if (Node.getIdentifier() != nullptr || !Node.hasDefaultArgument() ||
22-
Node.getDefaultArgumentInfo() == nullptr)
22+
Node.getDefaultArgument().getArgument().isNull())
2323
return false;
2424

25-
TypeLoc DefaultArgTypeLoc = Node.getDefaultArgumentInfo()->getTypeLoc();
25+
TypeLoc DefaultArgTypeLoc =
26+
Node.getDefaultArgument().getTypeSourceInfo()->getTypeLoc();
2627
return InnerMatcher.matches(DefaultArgTypeLoc, Finder, Builder);
2728
}
2829

clang-tools-extra/clang-tidy/modernize/UseConstraintsCheck.cpp

+5-3
Original file line numberDiff line numberDiff line change
@@ -177,9 +177,11 @@ matchTrailingTemplateParam(const FunctionTemplateDecl *FunctionTemplate) {
177177
dyn_cast<TemplateTypeParmDecl>(LastParam)) {
178178
if (LastTemplateParam->hasDefaultArgument() &&
179179
LastTemplateParam->getIdentifier() == nullptr) {
180-
return {matchEnableIfSpecialization(
181-
LastTemplateParam->getDefaultArgumentInfo()->getTypeLoc()),
182-
LastTemplateParam};
180+
return {
181+
matchEnableIfSpecialization(LastTemplateParam->getDefaultArgument()
182+
.getTypeSourceInfo()
183+
->getTypeLoc()),
184+
LastTemplateParam};
183185
}
184186
}
185187
return {};

clang-tools-extra/clangd/Hover.cpp

+6-2
Original file line numberDiff line numberDiff line change
@@ -247,8 +247,12 @@ fetchTemplateParameters(const TemplateParameterList *Params,
247247
if (!TTP->getName().empty())
248248
P.Name = TTP->getNameAsString();
249249

250-
if (TTP->hasDefaultArgument())
251-
P.Default = TTP->getDefaultArgument().getAsString(PP);
250+
if (TTP->hasDefaultArgument()) {
251+
P.Default.emplace();
252+
llvm::raw_string_ostream Out(*P.Default);
253+
TTP->getDefaultArgument().getArgument().print(PP, Out,
254+
/*IncludeType=*/false);
255+
}
252256
} else if (const auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(Param)) {
253257
P.Type = printType(NTTP, PP);
254258

clang/include/clang/AST/ASTNodeTraverser.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -695,7 +695,7 @@ class ASTNodeTraverser
695695
if (const auto *TC = D->getTypeConstraint())
696696
Visit(TC->getImmediatelyDeclaredConstraint());
697697
if (D->hasDefaultArgument())
698-
Visit(D->getDefaultArgument(), SourceRange(),
698+
Visit(D->getDefaultArgument().getArgument(), SourceRange(),
699699
D->getDefaultArgStorage().getInheritedFrom(),
700700
D->defaultArgumentWasInherited() ? "inherited from" : "previous");
701701
}

clang/include/clang/AST/DeclTemplate.h

+6-11
Original file line numberDiff line numberDiff line change
@@ -1185,7 +1185,7 @@ class TemplateTypeParmDecl final : public TypeDecl,
11851185

11861186
/// The default template argument, if any.
11871187
using DefArgStorage =
1188-
DefaultArgStorage<TemplateTypeParmDecl, TypeSourceInfo *>;
1188+
DefaultArgStorage<TemplateTypeParmDecl, TemplateArgumentLoc *>;
11891189
DefArgStorage DefaultArgument;
11901190

11911191
TemplateTypeParmDecl(DeclContext *DC, SourceLocation KeyLoc,
@@ -1225,13 +1225,9 @@ class TemplateTypeParmDecl final : public TypeDecl,
12251225
bool hasDefaultArgument() const { return DefaultArgument.isSet(); }
12261226

12271227
/// Retrieve the default argument, if any.
1228-
QualType getDefaultArgument() const {
1229-
return DefaultArgument.get()->getType();
1230-
}
1231-
1232-
/// Retrieves the default argument's source information, if any.
1233-
TypeSourceInfo *getDefaultArgumentInfo() const {
1234-
return DefaultArgument.get();
1228+
const TemplateArgumentLoc &getDefaultArgument() const {
1229+
static const TemplateArgumentLoc NoneLoc;
1230+
return DefaultArgument.isSet() ? *DefaultArgument.get() : NoneLoc;
12351231
}
12361232

12371233
/// Retrieves the location of the default argument declaration.
@@ -1244,9 +1240,8 @@ class TemplateTypeParmDecl final : public TypeDecl,
12441240
}
12451241

12461242
/// Set the default argument for this template parameter.
1247-
void setDefaultArgument(TypeSourceInfo *DefArg) {
1248-
DefaultArgument.set(DefArg);
1249-
}
1243+
void setDefaultArgument(const ASTContext &C,
1244+
const TemplateArgumentLoc &DefArg);
12501245

12511246
/// Set that this default argument was inherited from another
12521247
/// parameter.

clang/include/clang/AST/RecursiveASTVisitor.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -1960,7 +1960,7 @@ DEF_TRAVERSE_DECL(TemplateTypeParmDecl, {
19601960
TRY_TO(TraverseType(QualType(D->getTypeForDecl(), 0)));
19611961
TRY_TO(TraverseTemplateTypeParamDeclConstraints(D));
19621962
if (D->hasDefaultArgument() && !D->defaultArgumentWasInherited())
1963-
TRY_TO(TraverseTypeLoc(D->getDefaultArgumentInfo()->getTypeLoc()));
1963+
TRY_TO(TraverseTemplateArgumentLoc(D->getDefaultArgument()));
19641964
})
19651965

19661966
DEF_TRAVERSE_DECL(TypedefDecl, {

clang/include/clang/Sema/Sema.h

+3-1
Original file line numberDiff line numberDiff line change
@@ -10067,7 +10067,9 @@ class Sema final : public SemaBase {
1006710067

1006810068
bool SubstTemplateArgument(const TemplateArgumentLoc &Input,
1006910069
const MultiLevelTemplateArgumentList &TemplateArgs,
10070-
TemplateArgumentLoc &Output);
10070+
TemplateArgumentLoc &Output,
10071+
SourceLocation Loc = {},
10072+
const DeclarationName &Entity = {});
1007110073
bool
1007210074
SubstTemplateArguments(ArrayRef<TemplateArgumentLoc> Args,
1007310075
const MultiLevelTemplateArgumentList &TemplateArgs,

clang/lib/AST/ASTContext.cpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -6494,7 +6494,8 @@ bool ASTContext::isSameDefaultTemplateArgument(const NamedDecl *X,
64946494
if (!TTPX->hasDefaultArgument() || !TTPY->hasDefaultArgument())
64956495
return false;
64966496

6497-
return hasSameType(TTPX->getDefaultArgument(), TTPY->getDefaultArgument());
6497+
return hasSameType(TTPX->getDefaultArgument().getArgument().getAsType(),
6498+
TTPY->getDefaultArgument().getArgument().getAsType());
64986499
}
64996500

65006501
if (auto *NTTPX = dyn_cast<NonTypeTemplateParmDecl>(X)) {

clang/lib/AST/ASTImporter.cpp

+3-3
Original file line numberDiff line numberDiff line change
@@ -5917,11 +5917,11 @@ ASTNodeImporter::VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D) {
59175917
}
59185918

59195919
if (D->hasDefaultArgument()) {
5920-
Expected<TypeSourceInfo *> ToDefaultArgOrErr =
5921-
import(D->getDefaultArgumentInfo());
5920+
Expected<TemplateArgumentLoc> ToDefaultArgOrErr =
5921+
import(D->getDefaultArgument());
59225922
if (!ToDefaultArgOrErr)
59235923
return ToDefaultArgOrErr.takeError();
5924-
ToD->setDefaultArgument(*ToDefaultArgOrErr);
5924+
ToD->setDefaultArgument(ToD->getASTContext(), *ToDefaultArgOrErr);
59255925
}
59265926

59275927
return ToD;

clang/lib/AST/DeclPrinter.cpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -1883,7 +1883,8 @@ void DeclPrinter::VisitTemplateTypeParmDecl(const TemplateTypeParmDecl *TTP) {
18831883

18841884
if (TTP->hasDefaultArgument()) {
18851885
Out << " = ";
1886-
Out << TTP->getDefaultArgument().getAsString(Policy);
1886+
TTP->getDefaultArgument().getArgument().print(Policy, Out,
1887+
/*IncludeType=*/false);
18871888
}
18881889
}
18891890

clang/lib/AST/DeclTemplate.cpp

+12-5
Original file line numberDiff line numberDiff line change
@@ -669,23 +669,30 @@ TemplateTypeParmDecl::CreateDeserialized(const ASTContext &C, GlobalDeclID ID,
669669
}
670670

671671
SourceLocation TemplateTypeParmDecl::getDefaultArgumentLoc() const {
672-
return hasDefaultArgument()
673-
? getDefaultArgumentInfo()->getTypeLoc().getBeginLoc()
674-
: SourceLocation();
672+
return hasDefaultArgument() ? getDefaultArgument().getLocation()
673+
: SourceLocation();
675674
}
676675

677676
SourceRange TemplateTypeParmDecl::getSourceRange() const {
678677
if (hasDefaultArgument() && !defaultArgumentWasInherited())
679678
return SourceRange(getBeginLoc(),
680-
getDefaultArgumentInfo()->getTypeLoc().getEndLoc());
679+
getDefaultArgument().getSourceRange().getEnd());
681680
// TypeDecl::getSourceRange returns a range containing name location, which is
682681
// wrong for unnamed template parameters. e.g:
683682
// it will return <[[typename>]] instead of <[[typename]]>
684-
else if (getDeclName().isEmpty())
683+
if (getDeclName().isEmpty())
685684
return SourceRange(getBeginLoc());
686685
return TypeDecl::getSourceRange();
687686
}
688687

688+
void TemplateTypeParmDecl::setDefaultArgument(
689+
const ASTContext &C, const TemplateArgumentLoc &DefArg) {
690+
if (DefArg.getArgument().isNull())
691+
DefaultArgument.set(nullptr);
692+
else
693+
DefaultArgument.set(new (C) TemplateArgumentLoc(DefArg));
694+
}
695+
689696
unsigned TemplateTypeParmDecl::getDepth() const {
690697
return getTypeForDecl()->castAs<TemplateTypeParmType>()->getDepth();
691698
}

clang/lib/AST/JSONNodeDumper.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -1028,7 +1028,7 @@ void JSONNodeDumper::VisitTemplateTypeParmDecl(const TemplateTypeParmDecl *D) {
10281028

10291029
if (D->hasDefaultArgument())
10301030
JOS.attributeObject("defaultArg", [=] {
1031-
Visit(D->getDefaultArgument(), SourceRange(),
1031+
Visit(D->getDefaultArgument().getArgument(), SourceRange(),
10321032
D->getDefaultArgStorage().getInheritedFrom(),
10331033
D->defaultArgumentWasInherited() ? "inherited from" : "previous");
10341034
});

clang/lib/AST/ODRDiagsEmitter.cpp

+7-5
Original file line numberDiff line numberDiff line change
@@ -1409,13 +1409,15 @@ bool ODRDiagsEmitter::diagnoseMismatch(
14091409
}
14101410

14111411
if (HasFirstDefaultArgument && HasSecondDefaultArgument) {
1412-
QualType FirstType = FirstTTPD->getDefaultArgument();
1413-
QualType SecondType = SecondTTPD->getDefaultArgument();
1414-
if (computeODRHash(FirstType) != computeODRHash(SecondType)) {
1412+
TemplateArgument FirstTA =
1413+
FirstTTPD->getDefaultArgument().getArgument();
1414+
TemplateArgument SecondTA =
1415+
SecondTTPD->getDefaultArgument().getArgument();
1416+
if (computeODRHash(FirstTA) != computeODRHash(SecondTA)) {
14151417
DiagTemplateError(FunctionTemplateParameterDifferentDefaultArgument)
1416-
<< (i + 1) << FirstType;
1418+
<< (i + 1) << FirstTA;
14171419
DiagTemplateNote(FunctionTemplateParameterDifferentDefaultArgument)
1418-
<< (i + 1) << SecondType;
1420+
<< (i + 1) << SecondTA;
14191421
return true;
14201422
}
14211423
}

clang/lib/AST/ODRHash.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -462,7 +462,7 @@ class ODRDeclVisitor : public ConstDeclVisitor<ODRDeclVisitor> {
462462
D->hasDefaultArgument() && !D->defaultArgumentWasInherited();
463463
Hash.AddBoolean(hasDefaultArgument);
464464
if (hasDefaultArgument) {
465-
AddTemplateArgument(D->getDefaultArgument());
465+
AddTemplateArgument(D->getDefaultArgument().getArgument());
466466
}
467467
Hash.AddBoolean(D->isParameterPack());
468468

clang/lib/AST/TypePrinter.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -2273,8 +2273,8 @@ bool clang::isSubstitutedDefaultArgument(ASTContext &Ctx, TemplateArgument Arg,
22732273

22742274
if (auto *TTPD = dyn_cast<TemplateTypeParmDecl>(Param)) {
22752275
return TTPD->hasDefaultArgument() &&
2276-
isSubstitutedTemplateArgument(Ctx, Arg, TTPD->getDefaultArgument(),
2277-
Args, Depth);
2276+
isSubstitutedTemplateArgument(
2277+
Ctx, Arg, TTPD->getDefaultArgument().getArgument(), Args, Depth);
22782278
} else if (auto *TTPD = dyn_cast<TemplateTemplateParmDecl>(Param)) {
22792279
return TTPD->hasDefaultArgument() &&
22802280
isSubstitutedTemplateArgument(

clang/lib/ExtractAPI/DeclarationFragments.cpp

+4-4
Original file line numberDiff line numberDiff line change
@@ -999,11 +999,11 @@ DeclarationFragmentsBuilder::getFragmentsForTemplateParameters(
999999
DeclarationFragments::FragmentKind::GenericParameter);
10001000

10011001
if (TemplateParam->hasDefaultArgument()) {
1002-
DeclarationFragments After;
1002+
const auto Default = TemplateParam->getDefaultArgument();
10031003
Fragments.append(" = ", DeclarationFragments::FragmentKind::Text)
1004-
.append(getFragmentsForType(TemplateParam->getDefaultArgument(),
1005-
TemplateParam->getASTContext(), After));
1006-
Fragments.append(std::move(After));
1004+
.append(getFragmentsForTemplateArguments(
1005+
{Default.getArgument()}, TemplateParam->getASTContext(),
1006+
{Default}));
10071007
}
10081008
} else if (const auto *NTP =
10091009
dyn_cast<NonTypeTemplateParmDecl>(ParameterArray[i])) {

clang/lib/Index/IndexDecl.cpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -703,7 +703,8 @@ class IndexingDeclVisitor : public ConstDeclVisitor<IndexingDeclVisitor, bool> {
703703
IndexCtx.handleDecl(TP);
704704
if (const auto *TTP = dyn_cast<TemplateTypeParmDecl>(TP)) {
705705
if (TTP->hasDefaultArgument())
706-
IndexCtx.indexTypeSourceInfo(TTP->getDefaultArgumentInfo(), Parent);
706+
handleTemplateArgumentLoc(TTP->getDefaultArgument(), Parent,
707+
TP->getLexicalDeclContext());
707708
if (auto *C = TTP->getTypeConstraint())
708709
IndexCtx.handleReference(C->getNamedConcept(), C->getConceptNameLoc(),
709710
Parent, TTP->getLexicalDeclContext());

clang/lib/Sema/HLSLExternalSemaSource.cpp

+28-20
Original file line numberDiff line numberDiff line change
@@ -308,17 +308,18 @@ struct BuiltinTypeDeclBuilder {
308308
return *this;
309309
}
310310

311-
TemplateParameterListBuilder addTemplateArgumentList();
312-
BuiltinTypeDeclBuilder &addSimpleTemplateParams(ArrayRef<StringRef> Names);
311+
TemplateParameterListBuilder addTemplateArgumentList(Sema &S);
312+
BuiltinTypeDeclBuilder &addSimpleTemplateParams(Sema &S,
313+
ArrayRef<StringRef> Names);
313314
};
314315

315316
struct TemplateParameterListBuilder {
316317
BuiltinTypeDeclBuilder &Builder;
317-
ASTContext &AST;
318+
Sema &S;
318319
llvm::SmallVector<NamedDecl *> Params;
319320

320-
TemplateParameterListBuilder(BuiltinTypeDeclBuilder &RB)
321-
: Builder(RB), AST(RB.Record->getASTContext()) {}
321+
TemplateParameterListBuilder(Sema &S, BuiltinTypeDeclBuilder &RB)
322+
: Builder(RB), S(S) {}
322323

323324
~TemplateParameterListBuilder() { finalizeTemplateArgs(); }
324325

@@ -328,12 +329,15 @@ struct TemplateParameterListBuilder {
328329
return *this;
329330
unsigned Position = static_cast<unsigned>(Params.size());
330331
auto *Decl = TemplateTypeParmDecl::Create(
331-
AST, Builder.Record->getDeclContext(), SourceLocation(),
332+
S.Context, Builder.Record->getDeclContext(), SourceLocation(),
332333
SourceLocation(), /* TemplateDepth */ 0, Position,
333-
&AST.Idents.get(Name, tok::TokenKind::identifier), /* Typename */ false,
334+
&S.Context.Idents.get(Name, tok::TokenKind::identifier),
335+
/* Typename */ false,
334336
/* ParameterPack */ false);
335337
if (!DefaultValue.isNull())
336-
Decl->setDefaultArgument(AST.getTrivialTypeSourceInfo(DefaultValue));
338+
Decl->setDefaultArgument(
339+
S.Context, S.getTrivialTemplateArgumentLoc(DefaultValue, QualType(),
340+
SourceLocation()));
337341

338342
Params.emplace_back(Decl);
339343
return *this;
@@ -342,11 +346,11 @@ struct TemplateParameterListBuilder {
342346
BuiltinTypeDeclBuilder &finalizeTemplateArgs() {
343347
if (Params.empty())
344348
return Builder;
345-
auto *ParamList =
346-
TemplateParameterList::Create(AST, SourceLocation(), SourceLocation(),
347-
Params, SourceLocation(), nullptr);
349+
auto *ParamList = TemplateParameterList::Create(S.Context, SourceLocation(),
350+
SourceLocation(), Params,
351+
SourceLocation(), nullptr);
348352
Builder.Template = ClassTemplateDecl::Create(
349-
AST, Builder.Record->getDeclContext(), SourceLocation(),
353+
S.Context, Builder.Record->getDeclContext(), SourceLocation(),
350354
DeclarationName(Builder.Record->getIdentifier()), ParamList,
351355
Builder.Record);
352356
Builder.Record->setDescribedClassTemplate(Builder.Template);
@@ -359,20 +363,22 @@ struct TemplateParameterListBuilder {
359363
Params.clear();
360364

361365
QualType T = Builder.Template->getInjectedClassNameSpecialization();
362-
T = AST.getInjectedClassNameType(Builder.Record, T);
366+
T = S.Context.getInjectedClassNameType(Builder.Record, T);
363367

364368
return Builder;
365369
}
366370
};
367371
} // namespace
368372

369-
TemplateParameterListBuilder BuiltinTypeDeclBuilder::addTemplateArgumentList() {
370-
return TemplateParameterListBuilder(*this);
373+
TemplateParameterListBuilder
374+
BuiltinTypeDeclBuilder::addTemplateArgumentList(Sema &S) {
375+
return TemplateParameterListBuilder(S, *this);
371376
}
372377

373378
BuiltinTypeDeclBuilder &
374-
BuiltinTypeDeclBuilder::addSimpleTemplateParams(ArrayRef<StringRef> Names) {
375-
TemplateParameterListBuilder Builder = this->addTemplateArgumentList();
379+
BuiltinTypeDeclBuilder::addSimpleTemplateParams(Sema &S,
380+
ArrayRef<StringRef> Names) {
381+
TemplateParameterListBuilder Builder = this->addTemplateArgumentList(S);
376382
for (StringRef Name : Names)
377383
Builder.addTypeParameter(Name);
378384
return Builder.finalizeTemplateArgs();
@@ -426,7 +432,9 @@ void HLSLExternalSemaSource::defineHLSLVectorAlias() {
426432
auto *TypeParam = TemplateTypeParmDecl::Create(
427433
AST, HLSLNamespace, SourceLocation(), SourceLocation(), 0, 0,
428434
&AST.Idents.get("element", tok::TokenKind::identifier), false, false);
429-
TypeParam->setDefaultArgument(AST.getTrivialTypeSourceInfo(AST.FloatTy));
435+
TypeParam->setDefaultArgument(
436+
AST, SemaPtr->getTrivialTemplateArgumentLoc(
437+
TemplateArgument(AST.FloatTy), QualType(), SourceLocation()));
430438

431439
TemplateParams.emplace_back(TypeParam);
432440

@@ -492,7 +500,7 @@ static BuiltinTypeDeclBuilder setupBufferType(CXXRecordDecl *Decl, Sema &S,
492500
void HLSLExternalSemaSource::defineHLSLTypesWithForwardDeclarations() {
493501
CXXRecordDecl *Decl;
494502
Decl = BuiltinTypeDeclBuilder(*SemaPtr, HLSLNamespace, "RWBuffer")
495-
.addSimpleTemplateParams({"element_type"})
503+
.addSimpleTemplateParams(*SemaPtr, {"element_type"})
496504
.Record;
497505
onCompletion(Decl, [this](CXXRecordDecl *Decl) {
498506
setupBufferType(Decl, *SemaPtr, ResourceClass::UAV,
@@ -503,7 +511,7 @@ void HLSLExternalSemaSource::defineHLSLTypesWithForwardDeclarations() {
503511

504512
Decl =
505513
BuiltinTypeDeclBuilder(*SemaPtr, HLSLNamespace, "RasterizerOrderedBuffer")
506-
.addSimpleTemplateParams({"element_type"})
514+
.addSimpleTemplateParams(*SemaPtr, {"element_type"})
507515
.Record;
508516
onCompletion(Decl, [this](CXXRecordDecl *Decl) {
509517
setupBufferType(Decl, *SemaPtr, ResourceClass::UAV,

0 commit comments

Comments
 (0)