From: David Majnemer Date: Wed, 18 Feb 2015 19:08:11 +0000 (+0000) Subject: Itanium ABI: Properly mangle extern "C" template arguments X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=16806a15ec7a2ced69eccbab873ab4387483ad72;p=clang 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 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@229724 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/AST/ItaniumMangle.cpp b/lib/AST/ItaniumMangle.cpp index f56e242d37..b97a2e6d57 100644 --- a/lib/AST/ItaniumMangle.cpp +++ b/lib/AST/ItaniumMangle.cpp @@ -69,6 +69,14 @@ static const DeclContext *getEffectiveDeclContext(const Decl *D) { if (const CapturedDecl *CD = dyn_cast(DC)) return getEffectiveDeclContext(CD); + if (const auto *VD = dyn_cast(D)) + if (VD->isExternC()) + return VD->getASTContext().getTranslationUnitDecl(); + + if (const auto *FD = dyn_cast(D)) + if (FD->isExternC()) + return FD->getASTContext().getTranslationUnitDecl(); + return DC; } diff --git a/test/CodeGenCXX/mangle-template.cpp b/test/CodeGenCXX/mangle-template.cpp index 28db27173e..25231c2b03 100644 --- a/test/CodeGenCXX/mangle-template.cpp +++ b/test/CodeGenCXX/mangle-template.cpp @@ -29,8 +29,7 @@ namespace test3 { // CHECK: void @test3_f0 extern "C" void test3_f0(float) {} template 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 a0) {} } @@ -38,8 +37,7 @@ namespace test4 { // CHECK: void @test4_f0 extern "C" void test4_f0(float) {} template 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 a0) {} }