MS ABI: Only class templates get complex nullptr pointer-to-member-functions
authorDavid Majnemer <david.majnemer@gmail.com>
Wed, 11 Jun 2014 07:08:37 +0000 (07:08 +0000)
committerDavid Majnemer <david.majnemer@gmail.com>
Wed, 11 Jun 2014 07:08:37 +0000 (07:08 +0000)
r210637 regressed CodeGenCXX/mangle-ms-templates-memptrs.cpp because it
did not believe that there is a distinction between class templates and
function templates.

Sadly, there is.  Function templates should behave in a compatible
manner with MSVC.

llvm-svn: 210642

clang/lib/AST/MicrosoftMangle.cpp

index 481ed44..33b8169 100644 (file)
@@ -1156,13 +1156,16 @@ void MicrosoftCXXNameMangler::mangleTemplateArg(const TemplateDecl *TD,
     QualType T = TA.getNullPtrType();
     if (const MemberPointerType *MPT = T->getAs<MemberPointerType>()) {
       const CXXRecordDecl *RD = MPT->getMostRecentCXXRecordDecl();
-      if (MPT->isMemberFunctionPointerType())
+      if (MPT->isMemberFunctionPointerType() && isa<ClassTemplateDecl>(TD)) {
         mangleMemberFunctionPointer(RD, nullptr);
-      else
+        return;
+      }
+      if (MPT->isMemberDataPointer()) {
         mangleMemberDataPointer(RD, nullptr);
-    } else {
-      Out << "$0A@";
+        return;
+      }
     }
+    Out << "$0A@";
     break;
   }
   case TemplateArgument::Expression: