We must always mangle attribute overloadable functions; even if in a

system header.
 - Prevents a codegen crash when anything used anything in tgmath! :)

llvm-svn: 65200
This commit is contained in:
Daniel Dunbar 2009-02-20 23:09:27 +00:00
parent 9e6fb74027
commit 0c4eda5923
2 changed files with 14 additions and 5 deletions

View File

@ -62,14 +62,14 @@ bool CXXNameMangler::mangle(const NamedDecl *D) {
// FIXME: Actually use a visitor to decode these?
if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
bool RequiresMangling = false;
// No mangled in an "implicit extern C" header.
if (Context.getSourceManager().getFileCharacteristic(FD->getLocation())
== SrcMgr::C_ExternCSystem)
RequiresMangling = false;
// Clang's "overloadable" attribute extension to C/C++ implies
// name mangling (always).
else if (FD->getAttr<OverloadableAttr>())
if (FD->getAttr<OverloadableAttr>())
RequiresMangling = true;
// No mangled in an "implicit extern C" header.
else if (Context.getSourceManager().getFileCharacteristic(FD->getLocation())
== SrcMgr::C_ExternCSystem)
RequiresMangling = false;
else if (Context.getLangOptions().CPlusPlus) {
// C++ requires name mangling, unless we're in a C linkage
// specification.

View File

@ -0,0 +1,9 @@
// RUN: clang -arch i386 -emit-llvm -o %t %s &&
// RUN: grep '@_Z2f0i' %t &&
// RUN: grep '@_Z2f0l' %t
// Make sure we mangle overloadable, even in C system headers.
# 1 "somesystemheader.h" 1 3 4
void __attribute__((__overloadable__)) f0(int a) {}
void __attribute__((__overloadable__)) f0(long b) {}