@@ -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,8 +4349,12 @@ void CXXNameMangler::mangleType(const PackExpansionType *T) {
43484349}
43494350
43504351void CXXNameMangler::mangleType (const PackIndexingType *T) {
4351- if (!T->hasSelectedType ())
4352+ // <type> ::= Dy <type> <expression> # pack indexing type (C++23)
4353+ if (!T->hasSelectedType ()) {
4354+ Out << " Dy" ;
43524355 mangleType (T->getPattern ());
4356+ mangleExpression (T->getIndexExpr ());
4357+ }
43534358 else
43544359 mangleType (T->getSelectedType ());
43554360}
@@ -4785,6 +4790,19 @@ void CXXNameMangler::mangleRequirement(SourceLocation RequiresExprLoc,
47854790 }
47864791}
47874792
4793+ void CXXNameMangler::mangleReferenceToPack (const NamedDecl* Pack) {
4794+ if (const TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(Pack))
4795+ mangleTemplateParameter (TTP->getDepth (), TTP->getIndex ());
4796+ else if (const NonTypeTemplateParmDecl *NTTP
4797+ = dyn_cast<NonTypeTemplateParmDecl>(Pack))
4798+ mangleTemplateParameter (NTTP->getDepth (), NTTP->getIndex ());
4799+ else if (const TemplateTemplateParmDecl *TempTP
4800+ = dyn_cast<TemplateTemplateParmDecl>(Pack))
4801+ mangleTemplateParameter (TempTP->getDepth (), TempTP->getIndex ());
4802+ else
4803+ mangleFunctionParam (cast<ParmVarDecl>(Pack));
4804+ }
4805+
47884806void CXXNameMangler::mangleExpression (const Expr *E, unsigned Arity,
47894807 bool AsTemplateArg) {
47904808 // <expression> ::= <unary operator-name> <expression>
@@ -4803,6 +4821,7 @@ void CXXNameMangler::mangleExpression(const Expr *E, unsigned Arity,
48034821 // ::= fpT # 'this' expression (part of <function-param>)
48044822 // ::= sr <type> <unqualified-name> # dependent name
48054823 // ::= sr <type> <unqualified-name> <template-args> # dependent template-id
4824+ // ::= sy <expression> <expression> # pack indexing expression
48064825 // ::= ds <expression> <expression> # expr.*expr
48074826 // ::= sZ <template-param> # size of a parameter pack
48084827 // ::= sZ <function-param> # size of a function parameter pack
@@ -4886,7 +4905,6 @@ void CXXNameMangler::mangleExpression(const Expr *E, unsigned Arity,
48864905 case Expr::OMPIteratorExprClass:
48874906 case Expr::CXXInheritedCtorInitExprClass:
48884907 case Expr::CXXParenListInitExprClass:
4889- case Expr::PackIndexingExprClass:
48904908 llvm_unreachable (" unexpected statement kind" );
48914909
48924910 case Expr::ConstantExprClass:
@@ -5788,17 +5806,7 @@ void CXXNameMangler::mangleExpression(const Expr *E, unsigned Arity,
57885806 }
57895807
57905808 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));
5809+ mangleReferenceToPack (SPE->getPack ());
58025810 break ;
58035811 }
58045812
@@ -5828,6 +5836,19 @@ void CXXNameMangler::mangleExpression(const Expr *E, unsigned Arity,
58285836 break ;
58295837 }
58305838
5839+ case Expr::PackIndexingExprClass: {
5840+ auto *PE = cast<PackIndexingExpr>(E);
5841+ if (PE->isFullySubstituted ()) {
5842+ E = PE->getSelectedExpr ();
5843+ goto recurse;
5844+ }
5845+ NotPrimaryExpr ();
5846+ Out << " sy" ;
5847+ mangleReferenceToPack (PE->getPackDecl ());
5848+ mangleExpression (PE->getIndexExpr ());
5849+ break ;
5850+ }
5851+
58315852 case Expr::CXXThisExprClass:
58325853 NotPrimaryExpr ();
58335854 Out << " fpT" ;
0 commit comments