summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Majnemer <david.majnemer@gmail.com>2015-02-18 19:08:11 +0000
committerDavid Majnemer <david.majnemer@gmail.com>2015-02-18 19:08:11 +0000
commitf8c02e6bfbe009ecbd683e794ccc15aafa9c2fd0 (patch)
tree57337d460ea7b885c1100fbdf29c501bae87c83d
parent11ae7789bafcd9186fe6a13a9db44e0c733d327a (diff)
downloadbcm5719-llvm-f8c02e6bfbe009ecbd683e794ccc15aafa9c2fd0.tar.gz
bcm5719-llvm-f8c02e6bfbe009ecbd683e794ccc15aafa9c2fd0.zip
Itanium ABI: Properly mangle extern "C" template arguments
extern "C" declarations should be considered like global declarations for mangling purposes. Differential Revision: http://reviews.llvm.org/D7718 llvm-svn: 229724
-rw-r--r--clang/lib/AST/ItaniumMangle.cpp8
-rw-r--r--clang/test/CodeGenCXX/mangle-template.cpp6
2 files changed, 10 insertions, 4 deletions
diff --git a/clang/lib/AST/ItaniumMangle.cpp b/clang/lib/AST/ItaniumMangle.cpp
index f56e242d374..b97a2e6d571 100644
--- a/clang/lib/AST/ItaniumMangle.cpp
+++ b/clang/lib/AST/ItaniumMangle.cpp
@@ -69,6 +69,14 @@ static const DeclContext *getEffectiveDeclContext(const Decl *D) {
if (const CapturedDecl *CD = dyn_cast<CapturedDecl>(DC))
return getEffectiveDeclContext(CD);
+ if (const auto *VD = dyn_cast<VarDecl>(D))
+ if (VD->isExternC())
+ return VD->getASTContext().getTranslationUnitDecl();
+
+ if (const auto *FD = dyn_cast<FunctionDecl>(D))
+ if (FD->isExternC())
+ return FD->getASTContext().getTranslationUnitDecl();
+
return DC;
}
diff --git a/clang/test/CodeGenCXX/mangle-template.cpp b/clang/test/CodeGenCXX/mangle-template.cpp
index 28db27173ec..25231c2b035 100644
--- a/clang/test/CodeGenCXX/mangle-template.cpp
+++ b/clang/test/CodeGenCXX/mangle-template.cpp
@@ -29,8 +29,7 @@ namespace test3 {
// CHECK: void @test3_f0
extern "C" void test3_f0(float) {}
template<void (&)(float)> struct t1 {};
-// FIXME: Fails because we tack on a namespace.
-// CHECK-FIXME: void @_ZN5test32f1ENS_2t1ILZ8test3_f0EEE(
+// CHECK: void @_ZN5test32f1ENS_2t1IL_Z8test3_f0EEE(
void f1(t1<test3_f0> a0) {}
}
@@ -38,8 +37,7 @@ namespace test4 {
// CHECK: void @test4_f0
extern "C" void test4_f0(float) {}
template<void (*)(float)> struct t1 {};
-// FIXME: Fails because we don't treat as an expression.
-// CHECK-FIXME: void @_ZN5test42f1ENS_2t1IXadL_Z8test4_f0EEEE(
+// CHECK: void @_ZN5test42f1ENS_2t1IXadL_Z8test4_f0EEEE(
void f1(t1<test4_f0> a0) {}
}
OpenPOWER on IntegriCloud