Mangle member pointer types in the Microsoft C++ Mangler.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@107567 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/CodeGen/MicrosoftCXXABI.cpp b/lib/CodeGen/MicrosoftCXXABI.cpp
index 960b1fe..1f3d788 100644
--- a/lib/CodeGen/MicrosoftCXXABI.cpp
+++ b/lib/CodeGen/MicrosoftCXXABI.cpp
@@ -645,7 +645,7 @@
     //                          ::= 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 @@
       // in there.
       mangleQualifiers(Quals, false);
   }
-  else if (T->isPointerType()) {
+  else if (T->isAnyPointerType() || T->isMemberPointerType()) {
     Out << 'P';
   }
   switch (T->getTypeClass()) {
@@ -1000,8 +1000,20 @@
   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 e221410..6f1ac3e 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 (__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() {}