diff options
author | David Majnemer <david.majnemer@gmail.com> | 2014-06-11 07:08:37 +0000 |
---|---|---|
committer | David Majnemer <david.majnemer@gmail.com> | 2014-06-11 07:08:37 +0000 |
commit | 1918787a72070e22593402657c90cb59fb7a8026 (patch) | |
tree | a34cc0d5e3091079b784f3727ddf750c70d0bfba /clang/lib/AST/MicrosoftMangle.cpp | |
parent | d623c528c5fb0f4bbd3b87105fbc5d1487b63444 (diff) | |
download | bcm5719-llvm-1918787a72070e22593402657c90cb59fb7a8026.tar.gz bcm5719-llvm-1918787a72070e22593402657c90cb59fb7a8026.zip |
MS ABI: Only class templates get complex nullptr pointer-to-member-functions
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
Diffstat (limited to 'clang/lib/AST/MicrosoftMangle.cpp')
-rw-r--r-- | clang/lib/AST/MicrosoftMangle.cpp | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/clang/lib/AST/MicrosoftMangle.cpp b/clang/lib/AST/MicrosoftMangle.cpp index 481ed44347e..33b81693918 100644 --- a/clang/lib/AST/MicrosoftMangle.cpp +++ b/clang/lib/AST/MicrosoftMangle.cpp @@ -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: |