@@ -50,12 +50,17 @@ getTemplateSpecializationArgLocs(const NamedDecl &ND) {
5050 if (const ASTTemplateArgumentListInfo *Args =
5151 Func->getTemplateSpecializationArgsAsWritten ())
5252 return Args->arguments ();
53- } else if (auto *Cls = llvm::dyn_cast<ClassTemplateSpecializationDecl>(&ND)) {
53+ } else if (auto *Cls =
54+ llvm::dyn_cast<ClassTemplatePartialSpecializationDecl>(&ND)) {
5455 if (auto *Args = Cls->getTemplateArgsAsWritten ())
5556 return Args->arguments ();
56- } else if (auto *Var = llvm::dyn_cast<VarTemplateSpecializationDecl>(&ND)) {
57+ } else if (auto *Var =
58+ llvm::dyn_cast<VarTemplatePartialSpecializationDecl>(&ND)) {
5759 if (auto *Args = Var->getTemplateArgsAsWritten ())
5860 return Args->arguments ();
61+ } else if (auto *Var = llvm::dyn_cast<VarTemplateSpecializationDecl>(&ND)) {
62+ if (auto *Args = Var->getTemplateArgsInfo ())
63+ return Args->arguments ();
5964 }
6065 // We return std::nullopt for ClassTemplateSpecializationDecls because it does
6166 // not contain TemplateArgumentLoc information.
@@ -265,10 +270,22 @@ std::string printTemplateSpecializationArgs(const NamedDecl &ND) {
265270 getTemplateSpecializationArgLocs (ND)) {
266271 printTemplateArgumentList (OS, *Args, Policy);
267272 } 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+ }
272289 }
273290 OS.flush ();
274291 return TemplateArgs;
@@ -436,12 +453,10 @@ bool hasReservedScope(const DeclContext &DC) {
436453}
437454
438455QualType declaredType (const TypeDecl *D) {
439- ASTContext &Context = D->getASTContext ();
440456 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);
445460}
446461
447462namespace {
0 commit comments