@@ -603,6 +603,7 @@ class CXXNameMangler {
603603 void mangleInitListElements (const InitListExpr *InitList);
604604 void mangleRequirement (SourceLocation RequiresExprLoc,
605605 const concepts::Requirement *Req);
606+ void mangleReferenceToPack (const NamedDecl *ND);
606607 void mangleExpression (const Expr *E, unsigned Arity = UnknownArity,
607608 bool AsTemplateArg = false );
608609 void mangleCXXCtorType (CXXCtorType T, const CXXRecordDecl *InheritedFrom);
@@ -4348,10 +4349,10 @@ void CXXNameMangler::mangleType(const PackExpansionType *T) {
43484349}
43494350
43504351void CXXNameMangler::mangleType (const PackIndexingType *T) {
4351- if (!T-> hasSelectedType () )
4352- mangleType (T-> getPattern ()) ;
4353- else
4354- mangleType (T->getSelectedType ());
4352+ // <type> ::= Dy <type> <expression> # pack indexing type (C++23 )
4353+ Out << " Dy " ;
4354+ mangleType (T-> getPattern ());
4355+ mangleExpression (T->getIndexExpr ());
43554356}
43564357
43574358void CXXNameMangler::mangleType (const ObjCInterfaceType *T) {
@@ -4787,6 +4788,7 @@ void CXXNameMangler::mangleRequirement(SourceLocation RequiresExprLoc,
47874788
47884789void CXXNameMangler::mangleExpression (const Expr *E, unsigned Arity,
47894790 bool AsTemplateArg) {
4791+ // clang-format off
47904792 // <expression> ::= <unary operator-name> <expression>
47914793 // ::= <binary operator-name> <expression> <expression>
47924794 // ::= <trinary operator-name> <expression> <expression> <expression>
@@ -4806,6 +4808,8 @@ void CXXNameMangler::mangleExpression(const Expr *E, unsigned Arity,
48064808 // ::= ds <expression> <expression> # expr.*expr
48074809 // ::= sZ <template-param> # size of a parameter pack
48084810 // ::= sZ <function-param> # size of a function parameter pack
4811+ // ::= sy <template-param> <expression> # pack indexing expression
4812+ // ::= sy <function-param> <expression> # pack indexing expression
48094813 // ::= u <source-name> <template-arg>* E # vendor extended expression
48104814 // ::= <expr-primary>
48114815 // <expr-primary> ::= L <type> <value number> E # integer literal
@@ -4815,6 +4819,7 @@ void CXXNameMangler::mangleExpression(const Expr *E, unsigned Arity,
48154819 // ::= L <pointer type> 0 E # null pointer template argument
48164820 // ::= L <type> <real-part float> _ <imag-part float> E # complex floating point literal (C99); not used by clang
48174821 // ::= L <mangled-name> E # external name
4822+ // clang-format on
48184823 QualType ImplicitlyConvertedToType;
48194824
48204825 // A top-level expression that's not <expr-primary> needs to be wrapped in
@@ -4886,7 +4891,6 @@ void CXXNameMangler::mangleExpression(const Expr *E, unsigned Arity,
48864891 case Expr::OMPIteratorExprClass:
48874892 case Expr::CXXInheritedCtorInitExprClass:
48884893 case Expr::CXXParenListInitExprClass:
4889- case Expr::PackIndexingExprClass:
48904894 llvm_unreachable (" unexpected statement kind" );
48914895
48924896 case Expr::ConstantExprClass:
@@ -5788,17 +5792,7 @@ void CXXNameMangler::mangleExpression(const Expr *E, unsigned Arity,
57885792 }
57895793
57905794 Out << " sZ" ;
5791- const NamedDecl *Pack = SPE->getPack ();
5792- if (const TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(Pack))
5793- mangleTemplateParameter (TTP->getDepth (), TTP->getIndex ());
5794- else if (const NonTypeTemplateParmDecl *NTTP
5795- = dyn_cast<NonTypeTemplateParmDecl>(Pack))
5796- mangleTemplateParameter (NTTP->getDepth (), NTTP->getIndex ());
5797- else if (const TemplateTemplateParmDecl *TempTP
5798- = dyn_cast<TemplateTemplateParmDecl>(Pack))
5799- mangleTemplateParameter (TempTP->getDepth (), TempTP->getIndex ());
5800- else
5801- mangleFunctionParam (cast<ParmVarDecl>(Pack));
5795+ mangleReferenceToPack (SPE->getPack ());
58025796 break ;
58035797 }
58045798
@@ -5828,6 +5822,15 @@ void CXXNameMangler::mangleExpression(const Expr *E, unsigned Arity,
58285822 break ;
58295823 }
58305824
5825+ case Expr::PackIndexingExprClass: {
5826+ auto *PE = cast<PackIndexingExpr>(E);
5827+ NotPrimaryExpr ();
5828+ Out << " sy" ;
5829+ mangleReferenceToPack (PE->getPackDecl ());
5830+ mangleExpression (PE->getIndexExpr ());
5831+ break ;
5832+ }
5833+
58315834 case Expr::CXXThisExprClass:
58325835 NotPrimaryExpr ();
58335836 Out << " fpT" ;
0 commit comments