@@ -378,8 +378,10 @@ class MicrosoftCXXNameMangler {
378
378
void mangleFunctionClass (const FunctionDecl *FD);
379
379
void mangleCallingConvention (CallingConv CC);
380
380
void mangleCallingConvention (const FunctionType *T);
381
- void mangleIntegerLiteral (const llvm::APSInt &Number, bool IsBoolean);
382
- void mangleExpression (const Expr *E);
381
+ void mangleIntegerLiteral (const llvm::APSInt &Number,
382
+ const NonTypeTemplateParmDecl *PD = nullptr ,
383
+ QualType TemplateArgType = QualType());
384
+ void mangleExpression (const Expr *E, const NonTypeTemplateParmDecl *PD);
383
385
void mangleThrowSpecification (const FunctionProtoType *T);
384
386
385
387
void mangleTemplateArgs (const TemplateDecl *TD,
@@ -1357,24 +1359,36 @@ MicrosoftCXXNameMangler::mangleUnscopedTemplateName(const TemplateDecl *TD) {
1357
1359
mangleUnqualifiedName (TD);
1358
1360
}
1359
1361
1360
- void MicrosoftCXXNameMangler::mangleIntegerLiteral (const llvm::APSInt &Value,
1361
- bool IsBoolean) {
1362
+ void MicrosoftCXXNameMangler::mangleIntegerLiteral (
1363
+ const llvm::APSInt &Value, const NonTypeTemplateParmDecl *PD,
1364
+ QualType TemplateArgType) {
1362
1365
// <integer-literal> ::= $0 <number>
1363
- Out << " $0" ;
1364
- // Make sure booleans are encoded as 0/1.
1365
- if (IsBoolean && Value.getBoolValue ())
1366
- mangleNumber (1 );
1367
- else if (Value.isSigned ())
1366
+ Out << " $" ;
1367
+
1368
+ // Since MSVC 2019, add 'M[<type>]' after '$' for auto template parameter when
1369
+ // argument is integer.
1370
+ if (getASTContext ().getLangOpts ().isCompatibleWithMSVC (
1371
+ LangOptions::MSVC2019) &&
1372
+ PD && PD->getType ()->getTypeClass () == Type::Auto &&
1373
+ !TemplateArgType.isNull ()) {
1374
+ Out << " M" ;
1375
+ mangleType (TemplateArgType, SourceRange (), QMM_Drop);
1376
+ }
1377
+
1378
+ Out << " 0" ;
1379
+
1380
+ if (Value.isSigned ())
1368
1381
mangleNumber (Value.getSExtValue ());
1369
1382
else
1370
1383
mangleNumber (Value.getZExtValue ());
1371
1384
}
1372
1385
1373
- void MicrosoftCXXNameMangler::mangleExpression (const Expr *E) {
1386
+ void MicrosoftCXXNameMangler::mangleExpression (
1387
+ const Expr *E, const NonTypeTemplateParmDecl *PD) {
1374
1388
// See if this is a constant expression.
1375
1389
if (Optional<llvm::APSInt> Value =
1376
1390
E->getIntegerConstantExpr (Context.getASTContext ())) {
1377
- mangleIntegerLiteral (*Value, E->getType ()-> isBooleanType ());
1391
+ mangleIntegerLiteral (*Value, PD, E->getType ());
1378
1392
return ;
1379
1393
}
1380
1394
@@ -1448,10 +1462,12 @@ void MicrosoftCXXNameMangler::mangleTemplateArg(const TemplateDecl *TD,
1448
1462
}
1449
1463
break ;
1450
1464
}
1451
- case TemplateArgument::Integral:
1465
+ case TemplateArgument::Integral: {
1466
+ QualType T = TA.getIntegralType ();
1452
1467
mangleIntegerLiteral (TA.getAsIntegral (),
1453
- TA. getIntegralType ()-> isBooleanType () );
1468
+ cast<NonTypeTemplateParmDecl>(Parm), T );
1454
1469
break ;
1470
+ }
1455
1471
case TemplateArgument::NullPtr: {
1456
1472
QualType T = TA.getNullPtrType ();
1457
1473
if (const MemberPointerType *MPT = T->getAs <MemberPointerType>()) {
@@ -1473,16 +1489,18 @@ void MicrosoftCXXNameMangler::mangleTemplateArg(const TemplateDecl *TD,
1473
1489
// However, we are free to use 0 *if* we would use multiple fields for
1474
1490
// non-nullptr member pointers.
1475
1491
if (!RD->nullFieldOffsetIsZero ()) {
1476
- mangleIntegerLiteral (llvm::APSInt::get (-1 ), /* IsBoolean=*/ false );
1492
+ mangleIntegerLiteral (llvm::APSInt::get (-1 ),
1493
+ cast<NonTypeTemplateParmDecl>(Parm), T);
1477
1494
return ;
1478
1495
}
1479
1496
}
1480
1497
}
1481
- mangleIntegerLiteral (llvm::APSInt::getUnsigned (0 ), /* IsBoolean=*/ false );
1498
+ mangleIntegerLiteral (llvm::APSInt::getUnsigned (0 ),
1499
+ cast<NonTypeTemplateParmDecl>(Parm), T);
1482
1500
break ;
1483
1501
}
1484
1502
case TemplateArgument::Expression:
1485
- mangleExpression (TA.getAsExpr ());
1503
+ mangleExpression (TA.getAsExpr (), cast<NonTypeTemplateParmDecl>(Parm) );
1486
1504
break ;
1487
1505
case TemplateArgument::Pack: {
1488
1506
ArrayRef<TemplateArgument> TemplateArgs = TA.getPackAsArray ();
@@ -1814,8 +1832,7 @@ void MicrosoftCXXNameMangler::mangleAddressSpaceType(QualType T,
1814
1832
if (Context.getASTContext ().addressSpaceMapManglingFor (AS)) {
1815
1833
unsigned TargetAS = Context.getASTContext ().getTargetAddressSpace (AS);
1816
1834
Extra.mangleSourceName (" _AS" );
1817
- Extra.mangleIntegerLiteral (llvm::APSInt::getUnsigned (TargetAS),
1818
- /* IsBoolean*/ false );
1835
+ Extra.mangleIntegerLiteral (llvm::APSInt::getUnsigned (TargetAS));
1819
1836
} else {
1820
1837
switch (AS) {
1821
1838
default :
@@ -2707,8 +2724,7 @@ void MicrosoftCXXNameMangler::mangleType(const VectorType *T, Qualifiers Quals,
2707
2724
Stream << " ?$" ;
2708
2725
Extra.mangleSourceName (" __vector" );
2709
2726
Extra.mangleType (QualType (ET, 0 ), Range, QMM_Escape);
2710
- Extra.mangleIntegerLiteral (llvm::APSInt::getUnsigned (T->getNumElements ()),
2711
- /* IsBoolean=*/ false );
2727
+ Extra.mangleIntegerLiteral (llvm::APSInt::getUnsigned (T->getNumElements ()));
2712
2728
2713
2729
mangleArtificialTagType (TTK_Union, TemplateMangling, {" __clang" });
2714
2730
}
@@ -2947,7 +2963,7 @@ void MicrosoftCXXNameMangler::mangleType(const PipeType *T, Qualifiers,
2947
2963
Stream << " ?$" ;
2948
2964
Extra.mangleSourceName (" ocl_pipe" );
2949
2965
Extra.mangleType (ElementType, Range, QMM_Escape);
2950
- Extra.mangleIntegerLiteral (llvm::APSInt::get (T->isReadOnly ()), true );
2966
+ Extra.mangleIntegerLiteral (llvm::APSInt::get (T->isReadOnly ()));
2951
2967
2952
2968
mangleArtificialTagType (TTK_Struct, TemplateMangling, {" __clang" });
2953
2969
}
@@ -2987,8 +3003,7 @@ void MicrosoftCXXNameMangler::mangleType(const ExtIntType *T, Qualifiers,
2987
3003
Extra.mangleSourceName (" _UExtInt" );
2988
3004
else
2989
3005
Extra.mangleSourceName (" _ExtInt" );
2990
- Extra.mangleIntegerLiteral (llvm::APSInt::getUnsigned (T->getNumBits ()),
2991
- /* IsBoolean=*/ false );
3006
+ Extra.mangleIntegerLiteral (llvm::APSInt::getUnsigned (T->getNumBits ()));
2992
3007
2993
3008
mangleArtificialTagType (TTK_Struct, TemplateMangling, {" __clang" });
2994
3009
}
0 commit comments