@@ -372,6 +372,11 @@ class MicrosoftCXXNameMangler {
372
372
void mangleMemberFunctionPointer (const CXXRecordDecl *RD,
373
373
const CXXMethodDecl *MD,
374
374
StringRef Prefix = " $" );
375
+ void mangleFunctionPointer (const FunctionDecl *FD,
376
+ const NonTypeTemplateParmDecl *PD,
377
+ QualType TemplateArgType);
378
+ void mangleVarDecl (const VarDecl *VD, const NonTypeTemplateParmDecl *PD,
379
+ QualType TemplateArgType);
375
380
void mangleMemberFunctionPointerInClassNTTP (const CXXRecordDecl *RD,
376
381
const CXXMethodDecl *MD);
377
382
void mangleVirtualMemPtrThunk (const CXXMethodDecl *MD,
@@ -799,6 +804,50 @@ MicrosoftCXXNameMangler::mangleMemberFunctionPointer(const CXXRecordDecl *RD,
799
804
mangleNumber (VBTableOffset);
800
805
}
801
806
807
+ void MicrosoftCXXNameMangler::mangleFunctionPointer (
808
+ const FunctionDecl *FD, const NonTypeTemplateParmDecl *PD,
809
+ QualType TemplateArgType) {
810
+ // <func-ptr> ::= $1? <mangled-name>
811
+ // <func-ptr> ::= <auto-nttp>
812
+ //
813
+ // <auto-nttp> ::= $ M <type> 1? <mangled-name>
814
+ Out << ' $' ;
815
+
816
+ if (getASTContext ().getLangOpts ().isCompatibleWithMSVC (
817
+ LangOptions::MSVC2019) &&
818
+ PD && PD->getType ()->getTypeClass () == Type::Auto &&
819
+ !TemplateArgType.isNull ()) {
820
+ Out << " M" ;
821
+ mangleType (TemplateArgType, SourceRange (), QMM_Drop);
822
+ }
823
+
824
+ Out << " 1?" ;
825
+ mangleName (FD);
826
+ mangleFunctionEncoding (FD, /* ShouldMangle=*/ true );
827
+ }
828
+
829
+ void MicrosoftCXXNameMangler::mangleVarDecl (const VarDecl *VD,
830
+ const NonTypeTemplateParmDecl *PD,
831
+ QualType TemplateArgType) {
832
+ // <var-ptr> ::= $1? <mangled-name>
833
+ // <var-ptr> ::= <auto-nttp>
834
+ //
835
+ // <auto-nttp> ::= $ M <type> 1? <mangled-name>
836
+ Out << ' $' ;
837
+
838
+ if (getASTContext ().getLangOpts ().isCompatibleWithMSVC (
839
+ LangOptions::MSVC2019) &&
840
+ PD && PD->getType ()->getTypeClass () == Type::Auto &&
841
+ !TemplateArgType.isNull ()) {
842
+ Out << " M" ;
843
+ mangleType (TemplateArgType, SourceRange (), QMM_Drop);
844
+ }
845
+
846
+ Out << " 1?" ;
847
+ mangleName (VD);
848
+ mangleVariableEncoding (VD);
849
+ }
850
+
802
851
void MicrosoftCXXNameMangler::mangleMemberFunctionPointerInClassNTTP (
803
852
const CXXRecordDecl *RD, const CXXMethodDecl *MD) {
804
853
// <nttp-class-member-function-pointer> ::= <member-function-pointer>
@@ -1555,6 +1604,9 @@ void MicrosoftCXXNameMangler::mangleIntegerLiteral(
1555
1604
const llvm::APSInt &Value, const NonTypeTemplateParmDecl *PD,
1556
1605
QualType TemplateArgType) {
1557
1606
// <integer-literal> ::= $0 <number>
1607
+ // <integer-literal> ::= <auto-nttp>
1608
+ //
1609
+ // <auto-nttp> ::= $ M <type> 0 <number>
1558
1610
Out << " $" ;
1559
1611
1560
1612
// Since MSVC 2019, add 'M[<type>]' after '$' for auto template parameter when
@@ -1632,8 +1684,11 @@ void MicrosoftCXXNameMangler::mangleTemplateArg(const TemplateDecl *TD,
1632
1684
// ::= <member-data-pointer>
1633
1685
// ::= <member-function-pointer>
1634
1686
// ::= $ <constant-value>
1687
+ // ::= $ <auto-nttp-constant-value>
1635
1688
// ::= <template-args>
1636
1689
//
1690
+ // <auto-nttp-constant-value> ::= M <type> <constant-value>
1691
+ //
1637
1692
// <constant-value> ::= 0 <number> # integer
1638
1693
// ::= 1 <mangled-name> # address of D
1639
1694
// ::= 2 <type> <typed-constant-value>* @ # struct
@@ -1681,15 +1736,17 @@ void MicrosoftCXXNameMangler::mangleTemplateArg(const TemplateDecl *TD,
1681
1736
mangleMemberFunctionPointer (
1682
1737
MD->getParent ()->getMostRecentNonInjectedDecl (), MD);
1683
1738
} else {
1684
- Out << " $1?" ;
1685
- mangleName (FD);
1686
- mangleFunctionEncoding (FD, /* ShouldMangle=*/ true );
1739
+ mangleFunctionPointer (FD, cast<NonTypeTemplateParmDecl>(Parm),
1740
+ TA.getParamTypeForDecl ());
1687
1741
}
1688
1742
} else if (TA.getParamTypeForDecl ()->isRecordType ()) {
1689
1743
Out << " $" ;
1690
1744
auto *TPO = cast<TemplateParamObjectDecl>(ND);
1691
1745
mangleTemplateArgValue (TPO->getType ().getUnqualifiedType (),
1692
1746
TPO->getValue (), TplArgKind::ClassNTTP);
1747
+ } else if (const VarDecl *VD = dyn_cast<VarDecl>(ND)) {
1748
+ mangleVarDecl (VD, cast<NonTypeTemplateParmDecl>(Parm),
1749
+ TA.getParamTypeForDecl ());
1693
1750
} else {
1694
1751
mangle (ND, " $1?" );
1695
1752
}
0 commit comments