summaryrefslogtreecommitdiffstats
path: root/clang/lib/AST/MicrosoftMangle.cpp
diff options
context:
space:
mode:
authorReid Kleckner <reid@kleckner.net>2014-02-05 18:59:38 +0000
committerReid Kleckner <reid@kleckner.net>2014-02-05 18:59:38 +0000
commit09b47d166b5355312a358a3fdb1c9850e8c5898d (patch)
tree889a6bcf9b26cef68257c660dd2a7048e8758932 /clang/lib/AST/MicrosoftMangle.cpp
parent21a6617c34c4c15183b5edf4d7df910395aad0b4 (diff)
downloadbcm5719-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.cpp13
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:
OpenPOWER on IntegriCloud