@@ -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>
@@ -1552,6 +1601,9 @@ void MicrosoftCXXNameMangler::mangleIntegerLiteral(
1552
1601
const llvm::APSInt &Value, const NonTypeTemplateParmDecl *PD,
1553
1602
QualType TemplateArgType) {
1554
1603
// <integer-literal> ::= $0 <number>
1604
+ // <integer-literal> ::= <auto-nttp>
1605
+ //
1606
+ // <auto-nttp> ::= $ M <type> 0 <number>
1555
1607
Out << " $" ;
1556
1608
1557
1609
// Since MSVC 2019, add 'M[<type>]' after '$' for auto template parameter when
@@ -1629,8 +1681,11 @@ void MicrosoftCXXNameMangler::mangleTemplateArg(const TemplateDecl *TD,
1629
1681
// ::= <member-data-pointer>
1630
1682
// ::= <member-function-pointer>
1631
1683
// ::= $ <constant-value>
1684
+ // ::= $ <auto-nttp-constant-value>
1632
1685
// ::= <template-args>
1633
1686
//
1687
+ // <auto-nttp-constant-value> ::= M <type> <constant-value>
1688
+ //
1634
1689
// <constant-value> ::= 0 <number> # integer
1635
1690
// ::= 1 <mangled-name> # address of D
1636
1691
// ::= 2 <type> <typed-constant-value>* @ # struct
@@ -1678,15 +1733,17 @@ void MicrosoftCXXNameMangler::mangleTemplateArg(const TemplateDecl *TD,
1678
1733
mangleMemberFunctionPointer (
1679
1734
MD->getParent ()->getMostRecentNonInjectedDecl (), MD);
1680
1735
} else {
1681
- Out << " $1?" ;
1682
- mangleName (FD);
1683
- mangleFunctionEncoding (FD, /* ShouldMangle=*/ true );
1736
+ mangleFunctionPointer (FD, cast<NonTypeTemplateParmDecl>(Parm),
1737
+ TA.getParamTypeForDecl ());
1684
1738
}
1685
1739
} else if (TA.getParamTypeForDecl ()->isRecordType ()) {
1686
1740
Out << " $" ;
1687
1741
auto *TPO = cast<TemplateParamObjectDecl>(ND);
1688
1742
mangleTemplateArgValue (TPO->getType ().getUnqualifiedType (),
1689
1743
TPO->getValue (), TplArgKind::ClassNTTP);
1744
+ } else if (const VarDecl *VD = dyn_cast<VarDecl>(ND)) {
1745
+ mangleVarDecl (VD, cast<NonTypeTemplateParmDecl>(Parm),
1746
+ TA.getParamTypeForDecl ());
1690
1747
} else {
1691
1748
mangle (ND, " $1?" );
1692
1749
}
0 commit comments