diff options
author | Reid Kleckner <reid@kleckner.net> | 2014-02-05 18:59:38 +0000 |
---|---|---|
committer | Reid Kleckner <reid@kleckner.net> | 2014-02-05 18:59:38 +0000 |
commit | 09b47d166b5355312a358a3fdb1c9850e8c5898d (patch) | |
tree | 889a6bcf9b26cef68257c660dd2a7048e8758932 /clang/lib/AST/MicrosoftMangle.cpp | |
parent | 21a6617c34c4c15183b5edf4d7df910395aad0b4 (diff) | |
download | bcm5719-llvm-09b47d166b5355312a358a3fdb1c9850e8c5898d.tar.gz bcm5719-llvm-09b47d166b5355312a358a3fdb1c9850e8c5898d.zip |
MS ABI: Fix mangling of static methods and function references
Function references always use $1? like function pointers and never $E?
like var decl references. Static methods are mangled like function
pointers.
llvm-svn: 200869
Diffstat (limited to 'clang/lib/AST/MicrosoftMangle.cpp')
-rw-r--r-- | clang/lib/AST/MicrosoftMangle.cpp | 13 |
1 files changed, 9 insertions, 4 deletions
diff --git a/clang/lib/AST/MicrosoftMangle.cpp b/clang/lib/AST/MicrosoftMangle.cpp index b2f74cf4d1e..6ce7018be19 100644 --- a/clang/lib/AST/MicrosoftMangle.cpp +++ b/clang/lib/AST/MicrosoftMangle.cpp @@ -1090,12 +1090,17 @@ void MicrosoftCXXNameMangler::mangleTemplateArg(const TemplateDecl *TD, } case TemplateArgument::Declaration: { const NamedDecl *ND = cast<NamedDecl>(TA.getAsDecl()); - if (const FieldDecl *FD = dyn_cast<FieldDecl>(ND)) + if (const FieldDecl *FD = dyn_cast<FieldDecl>(ND)) { mangleMemberDataPointer(cast<CXXRecordDecl>(FD->getParent()), FD); - else if (const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(ND)) - mangleMemberFunctionPointer(MD->getParent(), MD); - else + } else if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(ND)) { + const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(ND); + if (MD && MD->isInstance()) + mangleMemberFunctionPointer(MD->getParent(), MD); + else + mangle(ND, "$1?"); + } else { mangle(ND, TA.isDeclForReferenceParam() ? "$E?" : "$1?"); + } break; } case TemplateArgument::Integral: |