@@ -368,11 +368,15 @@ class MicrosoftCXXNameMangler {
368
368
void mangleFunctionEncoding (GlobalDecl GD, bool ShouldMangle);
369
369
void mangleVariableEncoding (const VarDecl *VD);
370
370
void mangleMemberDataPointer (const CXXRecordDecl *RD, const ValueDecl *VD,
371
+ const NonTypeTemplateParmDecl *PD,
372
+ QualType TemplateArgType,
371
373
StringRef Prefix = " $" );
372
374
void mangleMemberDataPointerInClassNTTP (const CXXRecordDecl *,
373
375
const ValueDecl *);
374
376
void mangleMemberFunctionPointer (const CXXRecordDecl *RD,
375
377
const CXXMethodDecl *MD,
378
+ const NonTypeTemplateParmDecl *PD,
379
+ QualType TemplateArgType,
376
380
StringRef Prefix = " $" );
377
381
void mangleFunctionPointer (const FunctionDecl *FD,
378
382
const NonTypeTemplateParmDecl *PD,
@@ -673,12 +677,17 @@ void MicrosoftCXXNameMangler::mangleVariableEncoding(const VarDecl *VD) {
673
677
}
674
678
}
675
679
676
- void MicrosoftCXXNameMangler::mangleMemberDataPointer (const CXXRecordDecl *RD,
677
- const ValueDecl *VD,
678
- StringRef Prefix) {
680
+ void MicrosoftCXXNameMangler::mangleMemberDataPointer (
681
+ const CXXRecordDecl *RD, const ValueDecl *VD,
682
+ const NonTypeTemplateParmDecl *PD, QualType TemplateArgType,
683
+ StringRef Prefix) {
679
684
// <member-data-pointer> ::= <integer-literal>
680
685
// ::= $F <number> <number>
681
686
// ::= $G <number> <number> <number>
687
+ //
688
+ // <auto-nttp> ::= $ M <type> <integer-literal>
689
+ // <auto-nttp> ::= $ M <type> F <name> <number>
690
+ // <auto-nttp> ::= $ M <type> G <name> <number> <number>
682
691
683
692
int64_t FieldOffset;
684
693
int64_t VBTableOffset;
@@ -707,7 +716,18 @@ void MicrosoftCXXNameMangler::mangleMemberDataPointer(const CXXRecordDecl *RD,
707
716
case MSInheritanceModel::Unspecified: Code = ' G' ; break ;
708
717
}
709
718
710
- Out << Prefix << Code;
719
+ Out << Prefix;
720
+
721
+ if (VD &&
722
+ getASTContext ().getLangOpts ().isCompatibleWithMSVC (
723
+ LangOptions::MSVC2019) &&
724
+ PD && PD->getType ()->getTypeClass () == Type::Auto &&
725
+ !TemplateArgType.isNull ()) {
726
+ Out << " M" ;
727
+ mangleType (TemplateArgType, SourceRange (), QMM_Drop);
728
+ }
729
+
730
+ Out << Code;
711
731
712
732
mangleNumber (FieldOffset);
713
733
@@ -728,7 +748,7 @@ void MicrosoftCXXNameMangler::mangleMemberDataPointerInClassNTTP(
728
748
// ::= 8 <postfix> @ <unqualified-name> @
729
749
730
750
if (IM != MSInheritanceModel::Single && IM != MSInheritanceModel::Multiple)
731
- return mangleMemberDataPointer (RD, VD, " " );
751
+ return mangleMemberDataPointer (RD, VD, nullptr , QualType (), " " );
732
752
733
753
if (!VD) {
734
754
Out << ' N' ;
@@ -742,14 +762,19 @@ void MicrosoftCXXNameMangler::mangleMemberDataPointerInClassNTTP(
742
762
Out << ' @' ;
743
763
}
744
764
745
- void
746
- MicrosoftCXXNameMangler::mangleMemberFunctionPointer ( const CXXRecordDecl *RD,
747
- const CXXMethodDecl *MD ,
748
- StringRef Prefix) {
765
+ void MicrosoftCXXNameMangler::mangleMemberFunctionPointer (
766
+ const CXXRecordDecl *RD, const CXXMethodDecl *MD ,
767
+ const NonTypeTemplateParmDecl *PD, QualType TemplateArgType ,
768
+ StringRef Prefix) {
749
769
// <member-function-pointer> ::= $1? <name>
750
770
// ::= $H? <name> <number>
751
771
// ::= $I? <name> <number> <number>
752
772
// ::= $J? <name> <number> <number> <number>
773
+ //
774
+ // <auto-nttp> ::= $ M <type> 1? <name>
775
+ // <auto-nttp> ::= $ M <type> H? <name> <number>
776
+ // <auto-nttp> ::= $ M <type> I? <name> <number> <number>
777
+ // <auto-nttp> ::= $ M <type> J? <name> <number> <number> <number>
753
778
754
779
MSInheritanceModel IM = RD->getMSInheritanceModel ();
755
780
@@ -767,7 +792,17 @@ MicrosoftCXXNameMangler::mangleMemberFunctionPointer(const CXXRecordDecl *RD,
767
792
uint64_t VBTableOffset = 0 ;
768
793
uint64_t VBPtrOffset = 0 ;
769
794
if (MD) {
770
- Out << Prefix << Code << ' ?' ;
795
+ Out << Prefix;
796
+
797
+ if (getASTContext ().getLangOpts ().isCompatibleWithMSVC (
798
+ LangOptions::MSVC2019) &&
799
+ PD && PD->getType ()->getTypeClass () == Type::Auto &&
800
+ !TemplateArgType.isNull ()) {
801
+ Out << " M" ;
802
+ mangleType (TemplateArgType, SourceRange (), QMM_Drop);
803
+ }
804
+
805
+ Out << Code << ' ?' ;
771
806
if (MD->isVirtual ()) {
772
807
MicrosoftVTableContext *VTContext =
773
808
cast<MicrosoftVTableContext>(getASTContext ().getVTableContext ());
@@ -859,7 +894,7 @@ void MicrosoftCXXNameMangler::mangleMemberFunctionPointerInClassNTTP(
859
894
860
895
if (!MD) {
861
896
if (RD->getMSInheritanceModel () != MSInheritanceModel::Single)
862
- return mangleMemberFunctionPointer (RD, MD, " " );
897
+ return mangleMemberFunctionPointer (RD, MD, nullptr , QualType (), " " );
863
898
864
899
Out << ' N' ;
865
900
return ;
@@ -1732,12 +1767,15 @@ void MicrosoftCXXNameMangler::mangleTemplateArg(const TemplateDecl *TD,
1732
1767
if (isa<FieldDecl>(ND) || isa<IndirectFieldDecl>(ND)) {
1733
1768
mangleMemberDataPointer (cast<CXXRecordDecl>(ND->getDeclContext ())
1734
1769
->getMostRecentNonInjectedDecl (),
1735
- cast<ValueDecl>(ND));
1770
+ cast<ValueDecl>(ND),
1771
+ cast<NonTypeTemplateParmDecl>(Parm),
1772
+ TA.getParamTypeForDecl ());
1736
1773
} else if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(ND)) {
1737
1774
const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(FD);
1738
1775
if (MD && MD->isInstance ()) {
1739
1776
mangleMemberFunctionPointer (
1740
- MD->getParent ()->getMostRecentNonInjectedDecl (), MD);
1777
+ MD->getParent ()->getMostRecentNonInjectedDecl (), MD,
1778
+ cast<NonTypeTemplateParmDecl>(Parm), TA.getParamTypeForDecl ());
1741
1779
} else {
1742
1780
mangleFunctionPointer (FD, cast<NonTypeTemplateParmDecl>(Parm),
1743
1781
TA.getParamTypeForDecl ());
@@ -1767,12 +1805,12 @@ void MicrosoftCXXNameMangler::mangleTemplateArg(const TemplateDecl *TD,
1767
1805
const CXXRecordDecl *RD = MPT->getMostRecentCXXRecordDecl ();
1768
1806
if (MPT->isMemberFunctionPointerType () &&
1769
1807
!isa<FunctionTemplateDecl>(TD)) {
1770
- mangleMemberFunctionPointer (RD, nullptr );
1808
+ mangleMemberFunctionPointer (RD, nullptr , nullptr , QualType () );
1771
1809
return ;
1772
1810
}
1773
1811
if (MPT->isMemberDataPointer ()) {
1774
1812
if (!isa<FunctionTemplateDecl>(TD)) {
1775
- mangleMemberDataPointer (RD, nullptr );
1813
+ mangleMemberDataPointer (RD, nullptr , nullptr , QualType () );
1776
1814
return ;
1777
1815
}
1778
1816
// nullptr data pointers are always represented with a single field
@@ -1979,9 +2017,10 @@ void MicrosoftCXXNameMangler::mangleTemplateArgValue(QualType T,
1979
2017
cast_or_null<CXXMethodDecl>(D));
1980
2018
} else {
1981
2019
if (T->isMemberDataPointerType ())
1982
- mangleMemberDataPointer (RD, D, " " );
2020
+ mangleMemberDataPointer (RD, D, nullptr , QualType (), " " );
1983
2021
else
1984
- mangleMemberFunctionPointer (RD, cast_or_null<CXXMethodDecl>(D), " " );
2022
+ mangleMemberFunctionPointer (RD, cast_or_null<CXXMethodDecl>(D), nullptr ,
2023
+ QualType (), " " );
1985
2024
}
1986
2025
return ;
1987
2026
}
0 commit comments