@@ -170,6 +170,8 @@ class ItaniumMangleContextImpl : public ItaniumMangleContext {
170
170
171
171
void mangleStringLiteral (const StringLiteral *, raw_ostream &) override ;
172
172
173
+ void mangleLambdaSig (const CXXRecordDecl *Lambda, raw_ostream &) override ;
174
+
173
175
bool getNextDiscriminator (const NamedDecl *ND, unsigned &disc) {
174
176
// Lambda closure types are already numbered.
175
177
if (isLambda (ND))
@@ -424,6 +426,7 @@ class CXXNameMangler {
424
426
void mangleName (const NamedDecl *ND);
425
427
void mangleType (QualType T);
426
428
void mangleNameOrStandardSubstitution (const NamedDecl *ND);
429
+ void mangleLambdaSig (const CXXRecordDecl *Lambda);
427
430
428
431
private:
429
432
@@ -550,7 +553,7 @@ class CXXNameMangler {
550
553
void mangleTemplateArgs (const TemplateArgumentList &AL);
551
554
void mangleTemplateArg (TemplateArgument A);
552
555
553
- void mangleTemplateParameter (unsigned Index);
556
+ void mangleTemplateParameter (unsigned Depth, unsigned Index);
554
557
555
558
void mangleFunctionParam (const ParmVarDecl *parm);
556
559
@@ -965,7 +968,7 @@ void CXXNameMangler::mangleUnscopedTemplateName(
965
968
if (const auto *TTP = dyn_cast<TemplateTemplateParmDecl>(ND)) {
966
969
assert (!AdditionalAbiTags &&
967
970
" template template param cannot have abi tags" );
968
- mangleTemplateParameter (TTP->getIndex ());
971
+ mangleTemplateParameter (TTP->getDepth (), TTP-> getIndex ());
969
972
} else if (isa<BuiltinTemplateDecl>(ND)) {
970
973
mangleUnscopedName (ND, AdditionalAbiTags);
971
974
} else {
@@ -1686,16 +1689,42 @@ void CXXNameMangler::mangleUnqualifiedBlock(const BlockDecl *Block) {
1686
1689
// ::= Tn <type> # template non-type parameter
1687
1690
// ::= Tt <template-param-decl>* E # template template parameter
1688
1691
void CXXNameMangler::mangleTemplateParamDecl (const NamedDecl *Decl) {
1689
- if (isa<TemplateTypeParmDecl>(Decl)) {
1692
+ if (auto *Ty = dyn_cast<TemplateTypeParmDecl>(Decl)) {
1693
+ if (Ty->isParameterPack ())
1694
+ Out << " Tp" ;
1690
1695
Out << " Ty" ;
1691
1696
} else if (auto *Tn = dyn_cast<NonTypeTemplateParmDecl>(Decl)) {
1692
- Out << " Tn" ;
1693
- mangleType (Tn->getType ());
1697
+ if (Tn->isExpandedParameterPack ()) {
1698
+ for (unsigned I = 0 , N = Tn->getNumExpansionTypes (); I != N; ++I) {
1699
+ Out << " Tn" ;
1700
+ mangleType (Tn->getExpansionType (I));
1701
+ }
1702
+ } else {
1703
+ QualType T = Tn->getType ();
1704
+ if (Tn->isParameterPack ()) {
1705
+ Out << " Tp" ;
1706
+ T = T->castAs <PackExpansionType>()->getPattern ();
1707
+ }
1708
+ Out << " Tn" ;
1709
+ mangleType (T);
1710
+ }
1694
1711
} else if (auto *Tt = dyn_cast<TemplateTemplateParmDecl>(Decl)) {
1695
- Out << " Tt" ;
1696
- for (auto *Param : *Tt->getTemplateParameters ())
1697
- mangleTemplateParamDecl (Param);
1698
- Out << " E" ;
1712
+ if (Tt->isExpandedParameterPack ()) {
1713
+ for (unsigned I = 0 , N = Tt->getNumExpansionTemplateParameters (); I != N;
1714
+ ++I) {
1715
+ Out << " Tt" ;
1716
+ for (auto *Param : *Tt->getExpansionTemplateParameters (I))
1717
+ mangleTemplateParamDecl (Param);
1718
+ Out << " E" ;
1719
+ }
1720
+ } else {
1721
+ if (Tt->isParameterPack ())
1722
+ Out << " Tp" ;
1723
+ Out << " Tt" ;
1724
+ for (auto *Param : *Tt->getTemplateParameters ())
1725
+ mangleTemplateParamDecl (Param);
1726
+ Out << " E" ;
1727
+ }
1699
1728
}
1700
1729
}
1701
1730
@@ -1726,12 +1755,7 @@ void CXXNameMangler::mangleLambda(const CXXRecordDecl *Lambda) {
1726
1755
}
1727
1756
1728
1757
Out << " Ul" ;
1729
- for (auto *D : Lambda->getLambdaExplicitTemplateParameters ())
1730
- mangleTemplateParamDecl (D);
1731
- const FunctionProtoType *Proto = Lambda->getLambdaTypeInfo ()->getType ()->
1732
- getAs<FunctionProtoType>();
1733
- mangleBareFunctionType (Proto, /* MangleReturnType=*/ false ,
1734
- Lambda->getLambdaStaticInvoker ());
1758
+ mangleLambdaSig (Lambda);
1735
1759
Out << " E" ;
1736
1760
1737
1761
// The number is omitted for the first closure type with a given
@@ -1746,6 +1770,15 @@ void CXXNameMangler::mangleLambda(const CXXRecordDecl *Lambda) {
1746
1770
Out << ' _' ;
1747
1771
}
1748
1772
1773
+ void CXXNameMangler::mangleLambdaSig (const CXXRecordDecl *Lambda) {
1774
+ for (auto *D : Lambda->getLambdaExplicitTemplateParameters ())
1775
+ mangleTemplateParamDecl (D);
1776
+ const FunctionProtoType *Proto = Lambda->getLambdaTypeInfo ()->getType ()->
1777
+ getAs<FunctionProtoType>();
1778
+ mangleBareFunctionType (Proto, /* MangleReturnType=*/ false ,
1779
+ Lambda->getLambdaStaticInvoker ());
1780
+ }
1781
+
1749
1782
void CXXNameMangler::manglePrefix (NestedNameSpecifier *qualifier) {
1750
1783
switch (qualifier->getKind ()) {
1751
1784
case NestedNameSpecifier::Global:
@@ -1852,7 +1885,7 @@ void CXXNameMangler::mangleTemplatePrefix(const TemplateDecl *ND,
1852
1885
1853
1886
// <template-template-param> ::= <template-param>
1854
1887
if (const auto *TTP = dyn_cast<TemplateTemplateParmDecl>(ND)) {
1855
- mangleTemplateParameter (TTP->getIndex ());
1888
+ mangleTemplateParameter (TTP->getDepth (), TTP-> getIndex ());
1856
1889
} else {
1857
1890
manglePrefix (getEffectiveDeclContext (ND), NoFunction);
1858
1891
if (isa<BuiltinTemplateDecl>(ND))
@@ -1885,8 +1918,8 @@ void CXXNameMangler::mangleType(TemplateName TN) {
1885
1918
goto HaveDecl;
1886
1919
1887
1920
HaveDecl:
1888
- if (isa <TemplateTemplateParmDecl>(TD))
1889
- mangleTemplateParameter (cast<TemplateTemplateParmDecl>(TD) ->getIndex ());
1921
+ if (auto *TTP = dyn_cast <TemplateTemplateParmDecl>(TD))
1922
+ mangleTemplateParameter (TTP-> getDepth (), TTP ->getIndex ());
1890
1923
else
1891
1924
mangleName (TD);
1892
1925
break ;
@@ -2964,7 +2997,7 @@ void CXXNameMangler::mangleType(const MemberPointerType *T) {
2964
2997
2965
2998
// <type> ::= <template-param>
2966
2999
void CXXNameMangler::mangleType (const TemplateTypeParmType *T) {
2967
- mangleTemplateParameter (T->getIndex ());
3000
+ mangleTemplateParameter (T->getDepth (), T-> getIndex ());
2968
3001
}
2969
3002
2970
3003
// <type> ::= <template-param>
@@ -3535,7 +3568,7 @@ void CXXNameMangler::mangleDeclRefExpr(const NamedDecl *D) {
3535
3568
3536
3569
case Decl::NonTypeTemplateParm:
3537
3570
const NonTypeTemplateParmDecl *PD = cast<NonTypeTemplateParmDecl>(D);
3538
- mangleTemplateParameter (PD->getIndex ());
3571
+ mangleTemplateParameter (PD->getDepth (), PD-> getIndex ());
3539
3572
break ;
3540
3573
}
3541
3574
}
@@ -4264,13 +4297,13 @@ void CXXNameMangler::mangleExpression(const Expr *E, unsigned Arity) {
4264
4297
Out << " sZ" ;
4265
4298
const NamedDecl *Pack = SPE->getPack ();
4266
4299
if (const TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(Pack))
4267
- mangleTemplateParameter (TTP->getIndex ());
4300
+ mangleTemplateParameter (TTP->getDepth (), TTP-> getIndex ());
4268
4301
else if (const NonTypeTemplateParmDecl *NTTP
4269
4302
= dyn_cast<NonTypeTemplateParmDecl>(Pack))
4270
- mangleTemplateParameter (NTTP->getIndex ());
4303
+ mangleTemplateParameter (NTTP->getDepth (), NTTP-> getIndex ());
4271
4304
else if (const TemplateTemplateParmDecl *TempTP
4272
4305
= dyn_cast<TemplateTemplateParmDecl>(Pack))
4273
- mangleTemplateParameter (TempTP->getIndex ());
4306
+ mangleTemplateParameter (TempTP->getDepth (), TempTP-> getIndex ());
4274
4307
else
4275
4308
mangleFunctionParam (cast<ParmVarDecl>(Pack));
4276
4309
break ;
@@ -4557,13 +4590,21 @@ void CXXNameMangler::mangleTemplateArg(TemplateArgument A) {
4557
4590
}
4558
4591
}
4559
4592
4560
- void CXXNameMangler::mangleTemplateParameter (unsigned Index) {
4593
+ void CXXNameMangler::mangleTemplateParameter (unsigned Depth, unsigned Index) {
4561
4594
// <template-param> ::= T_ # first template parameter
4562
4595
// ::= T <parameter-2 non-negative number> _
4563
- if (Index == 0 )
4564
- Out << " T_" ;
4565
- else
4566
- Out << ' T' << (Index - 1 ) << ' _' ;
4596
+ // ::= TL <L-1 non-negative number> __
4597
+ // ::= TL <L-1 non-negative number> _
4598
+ // <parameter-2 non-negative number> _
4599
+ //
4600
+ // The latter two manglings are from a proposal here:
4601
+ // https://github.com/itanium-cxx-abi/cxx-abi/issues/31#issuecomment-528122117
4602
+ Out << ' T' ;
4603
+ if (Depth != 0 )
4604
+ Out << ' L' << (Depth - 1 ) << ' _' ;
4605
+ if (Index != 0 )
4606
+ Out << (Index - 1 );
4607
+ Out << ' _' ;
4567
4608
}
4568
4609
4569
4610
void CXXNameMangler::mangleSeqID (unsigned SeqID) {
@@ -5080,6 +5121,12 @@ void ItaniumMangleContextImpl::mangleStringLiteral(const StringLiteral *, raw_os
5080
5121
llvm_unreachable (" Can't mangle string literals" );
5081
5122
}
5082
5123
5124
+ void ItaniumMangleContextImpl::mangleLambdaSig (const CXXRecordDecl *Lambda,
5125
+ raw_ostream &Out) {
5126
+ CXXNameMangler Mangler (*this , Out);
5127
+ Mangler.mangleLambdaSig (Lambda);
5128
+ }
5129
+
5083
5130
ItaniumMangleContext *
5084
5131
ItaniumMangleContext::create (ASTContext &Context, DiagnosticsEngine &Diags) {
5085
5132
return new ItaniumMangleContextImpl (Context, Diags);
0 commit comments