Author: majnemer Date: Wed Feb 18 13:08:11 2015 New Revision: 229724 URL: http://llvm.org/viewvc/llvm-project?rev=229724&view=rev Log: 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 Modified: cfe/trunk/lib/AST/ItaniumMangle.cpp cfe/trunk/test/CodeGenCXX/mangle-template.cpp Modified: cfe/trunk/lib/AST/ItaniumMangle.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ItaniumMangle.cpp?rev=229724&r1=229723&r2=229724&view=diff ============================================================================== --- cfe/trunk/lib/AST/ItaniumMangle.cpp (original) +++ cfe/trunk/lib/AST/ItaniumMangle.cpp Wed Feb 18 13:08:11 2015 @@ -69,6 +69,14 @@ static const DeclContext *getEffectiveDe 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; } Modified: cfe/trunk/test/CodeGenCXX/mangle-template.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/mangle-template.cpp?rev=229724&r1=229723&r2=229724&view=diff ============================================================================== --- cfe/trunk/test/CodeGenCXX/mangle-template.cpp (original) +++ cfe/trunk/test/CodeGenCXX/mangle-template.cpp Wed Feb 18 13:08:11 2015 @@ -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) {} } _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
