diff options
author | David Majnemer <david.majnemer@gmail.com> | 2015-07-02 09:43:11 +0000 |
---|---|---|
committer | David Majnemer <david.majnemer@gmail.com> | 2015-07-02 09:43:11 +0000 |
commit | 1023668bc2d625e7bb5c3ee776175d4e031b6e97 (patch) | |
tree | fa55010833c591662c72dd250d2c6b7b6e248c1b /clang/lib/AST | |
parent | 0912de3216b3b9cfe187816f7d7bc8fc2cb64dc3 (diff) | |
download | bcm5719-llvm-1023668bc2d625e7bb5c3ee776175d4e031b6e97.tar.gz bcm5719-llvm-1023668bc2d625e7bb5c3ee776175d4e031b6e97.zip |
[MS ABI] nullptr data member ptrs are mangled differently for classes vs fns
It turns out that nullptr pointers to data members act differently in
function templates vs class templates. Class templates use a variable
width representation proportional to the number of fields needed to
materialize it. Function templates always use a single '0' template
parameter. However, using '0' all the time is problematic if the class
uses single or multiple inheritance. In those cases, use -1.
llvm-svn: 241251
Diffstat (limited to 'clang/lib/AST')
-rw-r--r-- | clang/lib/AST/MicrosoftMangle.cpp | 18 |
1 files changed, 15 insertions, 3 deletions
diff --git a/clang/lib/AST/MicrosoftMangle.cpp b/clang/lib/AST/MicrosoftMangle.cpp index c50db60abe5..48a8fa541a6 100644 --- a/clang/lib/AST/MicrosoftMangle.cpp +++ b/clang/lib/AST/MicrosoftMangle.cpp @@ -1215,11 +1215,23 @@ void MicrosoftCXXNameMangler::mangleTemplateArg(const TemplateDecl *TD, return; } if (MPT->isMemberDataPointer()) { - mangleMemberDataPointer(RD, nullptr); - return; + if (isa<ClassTemplateDecl>(TD)) { + mangleMemberDataPointer(RD, nullptr); + return; + } + // nullptr data pointers are always represented with a single field + // which is initialized with either 0 or -1. Why -1? Well, we need to + // distinguish the case where the data member is at offset zero in the + // record. + // However, we are free to use 0 *if* we would use multiple fields for + // non-nullptr member pointers. + if (!RD->nullFieldOffsetIsZero()) { + mangleIntegerLiteral(llvm::APSInt::get(-1), /*IsBoolean=*/false); + return; + } } } - Out << "$0A@"; + mangleIntegerLiteral(llvm::APSInt::getUnsigned(0), /*IsBoolean=*/false); break; } case TemplateArgument::Expression: |