@@ -1653,57 +1653,65 @@ void TemplateParamObjectDecl::printAsInit(llvm::raw_ostream &OS,
16531653 getValue ().printPretty (OS, Policy, getType (), &getASTContext ());
16541654}
16551655
1656- TemplateParameterList *clang::getReplacedTemplateParameterList (const Decl *D) {
1656+ std::tuple<NamedDecl *, TemplateArgument>
1657+ clang::getReplacedTemplateParameter (Decl *D, unsigned Index) {
16571658 switch (D->getKind ()) {
1658- case Decl::Kind::CXXRecord:
1659- return cast<CXXRecordDecl>(D)
1660- ->getDescribedTemplate ()
1661- ->getTemplateParameters ();
1659+ case Decl::Kind::BuiltinTemplate:
16621660 case Decl::Kind::ClassTemplate:
1663- return cast<ClassTemplateDecl>(D)->getTemplateParameters ();
1661+ case Decl::Kind::Concept:
1662+ case Decl::Kind::FunctionTemplate:
1663+ case Decl::Kind::TemplateTemplateParm:
1664+ case Decl::Kind::TypeAliasTemplate:
1665+ case Decl::Kind::VarTemplate:
1666+ return {cast<TemplateDecl>(D)->getTemplateParameters ()->getParam (Index),
1667+ {}};
16641668 case Decl::Kind::ClassTemplateSpecialization: {
16651669 const auto *CTSD = cast<ClassTemplateSpecializationDecl>(D);
16661670 auto P = CTSD->getSpecializedTemplateOrPartial ();
1671+ TemplateParameterList *TPL;
16671672 if (const auto *CTPSD =
16681673 dyn_cast<ClassTemplatePartialSpecializationDecl *>(P))
1669- return CTPSD->getTemplateParameters ();
1670- return cast<ClassTemplateDecl *>(P)->getTemplateParameters ();
1674+ TPL = CTPSD->getTemplateParameters ();
1675+ else
1676+ TPL = cast<ClassTemplateDecl *>(P)->getTemplateParameters ();
1677+ return {TPL->getParam (Index), CTSD->getTemplateArgs ()[Index]};
1678+ }
1679+ case Decl::Kind::VarTemplateSpecialization: {
1680+ const auto *VTSD = cast<VarTemplateSpecializationDecl>(D);
1681+ auto P = VTSD->getSpecializedTemplateOrPartial ();
1682+ TemplateParameterList *TPL;
1683+ if (const auto *VTPSD = dyn_cast<VarTemplatePartialSpecializationDecl *>(P))
1684+ TPL = VTPSD->getTemplateParameters ();
1685+ else
1686+ TPL = cast<VarTemplateDecl *>(P)->getTemplateParameters ();
1687+ return {TPL->getParam (Index), VTSD->getTemplateArgs ()[Index]};
16711688 }
16721689 case Decl::Kind::ClassTemplatePartialSpecialization:
1673- return cast<ClassTemplatePartialSpecializationDecl>(D)
1674- ->getTemplateParameters ();
1675- case Decl::Kind::TypeAliasTemplate:
1676- return cast<TypeAliasTemplateDecl>(D)->getTemplateParameters ();
1677- case Decl::Kind::BuiltinTemplate:
1678- return cast<BuiltinTemplateDecl>(D)->getTemplateParameters ();
1690+ return {cast<ClassTemplatePartialSpecializationDecl>(D)
1691+ ->getTemplateParameters ()
1692+ ->getParam (Index),
1693+ {}};
1694+ case Decl::Kind::VarTemplatePartialSpecialization:
1695+ return {cast<VarTemplatePartialSpecializationDecl>(D)
1696+ ->getTemplateParameters ()
1697+ ->getParam (Index),
1698+ {}};
1699+ // This is used as the AssociatedDecl for placeholder type deduction.
1700+ case Decl::TemplateTypeParm:
1701+ return {cast<NamedDecl>(D), {}};
1702+ // FIXME: Always use the template decl as the AssociatedDecl.
1703+ case Decl::Kind::CXXRecord:
1704+ return getReplacedTemplateParameter (
1705+ cast<CXXRecordDecl>(D)->getDescribedClassTemplate (), Index);
16791706 case Decl::Kind::CXXDeductionGuide:
16801707 case Decl::Kind::CXXConversion:
16811708 case Decl::Kind::CXXConstructor:
16821709 case Decl::Kind::CXXDestructor:
16831710 case Decl::Kind::CXXMethod:
16841711 case Decl::Kind::Function:
1685- return cast<FunctionDecl>(D)
1686- ->getTemplateSpecializationInfo ()
1687- ->getTemplate ()
1688- ->getTemplateParameters ();
1689- case Decl::Kind::FunctionTemplate:
1690- return cast<FunctionTemplateDecl>(D)->getTemplateParameters ();
1691- case Decl::Kind::VarTemplate:
1692- return cast<VarTemplateDecl>(D)->getTemplateParameters ();
1693- case Decl::Kind::VarTemplateSpecialization: {
1694- const auto *VTSD = cast<VarTemplateSpecializationDecl>(D);
1695- auto P = VTSD->getSpecializedTemplateOrPartial ();
1696- if (const auto *VTPSD = dyn_cast<VarTemplatePartialSpecializationDecl *>(P))
1697- return VTPSD->getTemplateParameters ();
1698- return cast<VarTemplateDecl *>(P)->getTemplateParameters ();
1699- }
1700- case Decl::Kind::VarTemplatePartialSpecialization:
1701- return cast<VarTemplatePartialSpecializationDecl>(D)
1702- ->getTemplateParameters ();
1703- case Decl::Kind::TemplateTemplateParm:
1704- return cast<TemplateTemplateParmDecl>(D)->getTemplateParameters ();
1705- case Decl::Kind::Concept:
1706- return cast<ConceptDecl>(D)->getTemplateParameters ();
1712+ return getReplacedTemplateParameter (
1713+ cast<FunctionDecl>(D)->getTemplateSpecializationInfo ()->getTemplate (),
1714+ Index);
17071715 default :
17081716 llvm_unreachable (" Unhandled templated declaration kind" );
17091717 }
0 commit comments