diff options
author | Anders Carlsson <andersca@mac.com> | 2009-11-07 07:15:03 +0000 |
---|---|---|
committer | Anders Carlsson <andersca@mac.com> | 2009-11-07 07:15:03 +0000 |
commit | c0a3561f0f6e1a4fa1d0c71687455a2da3484414 (patch) | |
tree | 5f8c556f977b8416cdcb4ed6869d258a5281862f /clang | |
parent | 5091272fdfdf19a3cdb06fb1595babd1f730ea89 (diff) | |
download | bcm5719-llvm-c0a3561f0f6e1a4fa1d0c71687455a2da3484414.tar.gz bcm5719-llvm-c0a3561f0f6e1a4fa1d0c71687455a2da3484414.zip |
Always mangle functions with special names. Fixes PR5420.
llvm-svn: 86350
Diffstat (limited to 'clang')
-rw-r--r-- | clang/lib/CodeGen/Mangle.cpp | 8 | ||||
-rw-r--r-- | clang/test/CodeGenCXX/mangle-system-header.cpp | 7 |
2 files changed, 12 insertions, 3 deletions
diff --git a/clang/lib/CodeGen/Mangle.cpp b/clang/lib/CodeGen/Mangle.cpp index 081156cb6e3..94abcbe3907 100644 --- a/clang/lib/CodeGen/Mangle.cpp +++ b/clang/lib/CodeGen/Mangle.cpp @@ -129,8 +129,10 @@ static bool isInCLinkageSpecification(const Decl *D) { bool CXXNameMangler::mangleFunctionDecl(const FunctionDecl *FD) { // Clang's "overloadable" attribute extension to C/C++ implies name mangling - // (always). - if (!FD->hasAttr<OverloadableAttr>()) { + // (always) as does passing a C++ member function and a function + // whose name is not a simple identifier. + if (!FD->hasAttr<OverloadableAttr>() && !isa<CXXMethodDecl>(FD) && + FD->getDeclName().isIdentifier()) { // C functions are not mangled, and "main" is never mangled. if (!Context.getASTContext().getLangOptions().CPlusPlus || FD->isMain()) return false; @@ -142,7 +144,7 @@ bool CXXNameMangler::mangleFunctionDecl(const FunctionDecl *FD) { return false; // No name mangling in a C linkage specification. - if (!isa<CXXMethodDecl>(FD) && isInCLinkageSpecification(FD)) + if (isInCLinkageSpecification(FD)) return false; } diff --git a/clang/test/CodeGenCXX/mangle-system-header.cpp b/clang/test/CodeGenCXX/mangle-system-header.cpp new file mode 100644 index 00000000000..8c642bd0753 --- /dev/null +++ b/clang/test/CodeGenCXX/mangle-system-header.cpp @@ -0,0 +1,7 @@ +// RUN: clang-cc -emit-llvm %s -o - -triple=x86_64-apple-darwin9 | FileCheck %s + +// PR5420 + +# 1 "fake_system_header.h" 1 3 4 +// CHECK: define void @_ZdlPvS_( +void operator delete (void*, void*) {} |