@@ -1653,57 +1653,65 @@ void TemplateParamObjectDecl::printAsInit(llvm::raw_ostream &OS,
1653
1653
getValue ().printPretty (OS, Policy, getType (), &getASTContext ());
1654
1654
}
1655
1655
1656
- TemplateParameterList *clang::getReplacedTemplateParameterList (const Decl *D) {
1656
+ std::tuple<NamedDecl *, TemplateArgument>
1657
+ clang::getReplacedTemplateParameter (Decl *D, unsigned Index) {
1657
1658
switch (D->getKind ()) {
1658
- case Decl::Kind::CXXRecord:
1659
- return cast<CXXRecordDecl>(D)
1660
- ->getDescribedTemplate ()
1661
- ->getTemplateParameters ();
1659
+ case Decl::Kind::BuiltinTemplate:
1662
1660
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
+ {}};
1664
1668
case Decl::Kind::ClassTemplateSpecialization: {
1665
1669
const auto *CTSD = cast<ClassTemplateSpecializationDecl>(D);
1666
1670
auto P = CTSD->getSpecializedTemplateOrPartial ();
1671
+ TemplateParameterList *TPL;
1667
1672
if (const auto *CTPSD =
1668
1673
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]};
1671
1688
}
1672
1689
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);
1679
1706
case Decl::Kind::CXXDeductionGuide:
1680
1707
case Decl::Kind::CXXConversion:
1681
1708
case Decl::Kind::CXXConstructor:
1682
1709
case Decl::Kind::CXXDestructor:
1683
1710
case Decl::Kind::CXXMethod:
1684
1711
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);
1707
1715
default :
1708
1716
llvm_unreachable (" Unhandled templated declaration kind" );
1709
1717
}
0 commit comments