diff options
author | David Majnemer <david.majnemer@gmail.com> | 2015-02-18 19:08:11 +0000 |
---|---|---|
committer | David Majnemer <david.majnemer@gmail.com> | 2015-02-18 19:08:11 +0000 |
commit | f8c02e6bfbe009ecbd683e794ccc15aafa9c2fd0 (patch) | |
tree | 57337d460ea7b885c1100fbdf29c501bae87c83d | |
parent | 11ae7789bafcd9186fe6a13a9db44e0c733d327a (diff) | |
download | bcm5719-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.cpp | 8 | ||||
-rw-r--r-- | clang/test/CodeGenCXX/mangle-template.cpp | 6 |
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) {} } |