@@ -50,12 +50,17 @@ getTemplateSpecializationArgLocs(const NamedDecl &ND) {
50
50
if (const ASTTemplateArgumentListInfo *Args =
51
51
Func->getTemplateSpecializationArgsAsWritten ())
52
52
return Args->arguments ();
53
- } else if (auto *Cls = llvm::dyn_cast<ClassTemplateSpecializationDecl>(&ND)) {
53
+ } else if (auto *Cls =
54
+ llvm::dyn_cast<ClassTemplatePartialSpecializationDecl>(&ND)) {
54
55
if (auto *Args = Cls->getTemplateArgsAsWritten ())
55
56
return Args->arguments ();
56
- } else if (auto *Var = llvm::dyn_cast<VarTemplateSpecializationDecl>(&ND)) {
57
+ } else if (auto *Var =
58
+ llvm::dyn_cast<VarTemplatePartialSpecializationDecl>(&ND)) {
57
59
if (auto *Args = Var->getTemplateArgsAsWritten ())
58
60
return Args->arguments ();
61
+ } else if (auto *Var = llvm::dyn_cast<VarTemplateSpecializationDecl>(&ND)) {
62
+ if (auto *Args = Var->getTemplateArgsInfo ())
63
+ return Args->arguments ();
59
64
}
60
65
// We return std::nullopt for ClassTemplateSpecializationDecls because it does
61
66
// not contain TemplateArgumentLoc information.
@@ -265,10 +270,22 @@ std::string printTemplateSpecializationArgs(const NamedDecl &ND) {
265
270
getTemplateSpecializationArgLocs (ND)) {
266
271
printTemplateArgumentList (OS, *Args, Policy);
267
272
} else if (auto *Cls = llvm::dyn_cast<ClassTemplateSpecializationDecl>(&ND)) {
268
- // FIXME: Fix cases when getTypeAsWritten returns null inside clang AST,
269
- // e.g. friend decls. Currently we fallback to Template Arguments without
270
- // location information.
271
- printTemplateArgumentList (OS, Cls->getTemplateArgs ().asArray (), Policy);
273
+ if (const TypeSourceInfo *TSI = Cls->getTypeAsWritten ()) {
274
+ // ClassTemplateSpecializationDecls do not contain
275
+ // TemplateArgumentTypeLocs, they only have TemplateArgumentTypes. So we
276
+ // create a new argument location list from TypeSourceInfo.
277
+ auto STL = TSI->getTypeLoc ().getAs <TemplateSpecializationTypeLoc>();
278
+ llvm::SmallVector<TemplateArgumentLoc> ArgLocs;
279
+ ArgLocs.reserve (STL.getNumArgs ());
280
+ for (unsigned I = 0 ; I < STL.getNumArgs (); ++I)
281
+ ArgLocs.push_back (STL.getArgLoc (I));
282
+ printTemplateArgumentList (OS, ArgLocs, Policy);
283
+ } else {
284
+ // FIXME: Fix cases when getTypeAsWritten returns null inside clang AST,
285
+ // e.g. friend decls. Currently we fallback to Template Arguments without
286
+ // location information.
287
+ printTemplateArgumentList (OS, Cls->getTemplateArgs ().asArray (), Policy);
288
+ }
272
289
}
273
290
OS.flush ();
274
291
return TemplateArgs;
@@ -436,12 +453,10 @@ bool hasReservedScope(const DeclContext &DC) {
436
453
}
437
454
438
455
QualType declaredType (const TypeDecl *D) {
439
- ASTContext &Context = D->getASTContext ();
440
456
if (const auto *CTSD = llvm::dyn_cast<ClassTemplateSpecializationDecl>(D))
441
- if (const auto *Args = CTSD->getTemplateArgsAsWritten ())
442
- return Context.getTemplateSpecializationType (
443
- TemplateName (CTSD->getSpecializedTemplate ()), Args->arguments ());
444
- return Context.getTypeDeclType (D);
457
+ if (const auto *TSI = CTSD->getTypeAsWritten ())
458
+ return TSI->getType ();
459
+ return D->getASTContext ().getTypeDeclType (D);
445
460
}
446
461
447
462
namespace {
0 commit comments