diff options
-rw-r--r-- | lib/CodeGen/MicrosoftCXXABI.cpp | 18 | ||||
-rw-r--r-- | test/CodeGenCXX/mangle-ms.cpp | 6 |
2 files changed, 21 insertions, 3 deletions
diff --git a/lib/CodeGen/MicrosoftCXXABI.cpp b/lib/CodeGen/MicrosoftCXXABI.cpp index 960b1fe77a..1f3d788df1 100644 --- a/lib/CodeGen/MicrosoftCXXABI.cpp +++ b/lib/CodeGen/MicrosoftCXXABI.cpp @@ -645,7 +645,7 @@ void MicrosoftCXXNameMangler::mangleType(QualType T) { // ::= Q # const pointer // ::= R # volatile pointer // ::= S # const volatile pointer - if (T->isPointerType()) { + if (T->isAnyPointerType() || T->isMemberPointerType()) { if (!Quals.hasVolatile()) { Out << 'Q'; } else { @@ -661,7 +661,7 @@ void MicrosoftCXXNameMangler::mangleType(QualType T) { // in there. mangleQualifiers(Quals, false); } - else if (T->isPointerType()) { + else if (T->isAnyPointerType() || T->isMemberPointerType()) { Out << 'P'; } switch (T->getTypeClass()) { @@ -1000,8 +1000,20 @@ void MicrosoftCXXNameMangler::mangleExtraDimensions(QualType ElementTy) { mangleType(ElementTy.getLocalUnqualifiedType()); } +// <type> ::= <pointer-to-member-type> +// <pointer-to-member-type> ::= <pointer-cvr-qualifiers> <cvr-qualifiers> +// <class name> <type> void MicrosoftCXXNameMangler::mangleType(const MemberPointerType *T) { - assert(false && "Don't know how to mangle MemberPointerTypes yet!"); + QualType PointeeType = T->getPointeeType(); + if (const FunctionProtoType *FPT = dyn_cast<FunctionProtoType>(PointeeType)) { + Out << '8'; + mangleName(cast<RecordType>(T->getClass())->getDecl()); + mangleType(FPT, NULL, false, true); + } else { + mangleQualifiers(PointeeType.getQualifiers(), true); + mangleName(cast<RecordType>(T->getClass())->getDecl()); + mangleType(PointeeType.getLocalUnqualifiedType()); + } } void MicrosoftCXXNameMangler::mangleType(const TemplateTypeParmType *T) { diff --git a/test/CodeGenCXX/mangle-ms.cpp b/test/CodeGenCXX/mangle-ms.cpp index e2214100f1..6f1ac3e750 100644 --- a/test/CodeGenCXX/mangle-ms.cpp +++ b/test/CodeGenCXX/mangle-ms.cpp @@ -10,6 +10,8 @@ // CHECK: @"\01?h@@3QAHA" // CHECK: @"\01?i@@3PAY0BD@HA" // CHECK: @"\01?j@@3P6GHCE@ZA" +// CHECK: @"\01?k@@3PTfoo@@DA" +// CHECK: @"\01?l@@3P8foo@@AAHH@ZA" int a; @@ -61,6 +63,10 @@ int i[10][20]; int (__stdcall *j)(signed char, unsigned char); +const volatile char foo::*k; + +int (foo::*l)(int); + // Static functions are mangled, too. // Also make sure calling conventions, arglists, and throw specs work. static void __stdcall alpha(float a, double b) throw() {} |