@@ -50,16 +50,11 @@ getTemplateSpecializationArgLocs(const NamedDecl &ND) {
50
50
if (const ASTTemplateArgumentListInfo *Args =
51
51
Func->getTemplateSpecializationArgsAsWritten ())
52
52
return Args->arguments ();
53
- } else if (auto *Cls =
54
- llvm::dyn_cast<ClassTemplatePartialSpecializationDecl>(&ND)) {
53
+ } else if (auto *Cls = llvm::dyn_cast<ClassTemplateSpecializationDecl>(&ND)) {
55
54
if (auto *Args = Cls->getTemplateArgsAsWritten ())
56
55
return Args->arguments ();
57
- } else if (auto *Var =
58
- llvm::dyn_cast<VarTemplatePartialSpecializationDecl>(&ND)) {
59
- if (auto *Args = Var->getTemplateArgsAsWritten ())
60
- return Args->arguments ();
61
56
} else if (auto *Var = llvm::dyn_cast<VarTemplateSpecializationDecl>(&ND)) {
62
- if (auto *Args = Var->getTemplateArgsInfo ())
57
+ if (auto *Args = Var->getTemplateArgsAsWritten ())
63
58
return Args->arguments ();
64
59
}
65
60
// We return std::nullopt for ClassTemplateSpecializationDecls because it does
@@ -270,22 +265,10 @@ std::string printTemplateSpecializationArgs(const NamedDecl &ND) {
270
265
getTemplateSpecializationArgLocs (ND)) {
271
266
printTemplateArgumentList (OS, *Args, Policy);
272
267
} else if (auto *Cls = llvm::dyn_cast<ClassTemplateSpecializationDecl>(&ND)) {
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
- }
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);
289
272
}
290
273
OS.flush ();
291
274
return TemplateArgs;
@@ -453,10 +436,12 @@ bool hasReservedScope(const DeclContext &DC) {
453
436
}
454
437
455
438
QualType declaredType (const TypeDecl *D) {
439
+ ASTContext &Context = D->getASTContext ();
456
440
if (const auto *CTSD = llvm::dyn_cast<ClassTemplateSpecializationDecl>(D))
457
- if (const auto *TSI = CTSD->getTypeAsWritten ())
458
- return TSI->getType ();
459
- return D->getASTContext ().getTypeDeclType (D);
441
+ if (const auto *Args = CTSD->getTemplateArgsAsWritten ())
442
+ return Context.getTemplateSpecializationType (
443
+ TemplateName (CTSD->getSpecializedTemplate ()), Args->arguments ());
444
+ return Context.getTypeDeclType (D);
460
445
}
461
446
462
447
namespace {
0 commit comments