Index: lib/AST/ItaniumMangle.cpp =================================================================== --- lib/AST/ItaniumMangle.cpp +++ lib/AST/ItaniumMangle.cpp @@ -69,6 +69,14 @@ 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; } Index: test/CodeGenCXX/mangle-template.cpp =================================================================== --- test/CodeGenCXX/mangle-template.cpp +++ test/CodeGenCXX/mangle-template.cpp @@ -28,8 +28,7 @@ // 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) {} } @@ -37,7 +36,7 @@ // CHECK: void @test4_f0 extern "C" void test4_f0(float) {} template struct t1 {}; -// CHECK: void @_ZN5test42f1ENS_2t1IXadL_ZNS_8test4_f0EEEEE( +// CHECK: void @_ZN5test42f1ENS_2t1IXadL_Z8test4_f0EEEE( void f1(t1 a0) {} }