Author: rsmith Date: Thu Apr 28 20:23:20 2016 New Revision: 267969 URL: http://llvm.org/viewvc/llvm-project?rev=267969&view=rev Log: PR27549: fix bug that resulted in us giving a translation-unit-scope variable a mangled name if it happened to be declared in an 'extern "C++"' context. This also causes us to use the '_ZL' mangling rather than the '_Z' mangling for internal-linkage entities that are wrapped in a language linkage construct.
Modified: cfe/trunk/lib/AST/ItaniumMangle.cpp cfe/trunk/test/CodeGenCXX/c-linkage.cpp cfe/trunk/test/CodeGenCXX/extern-c.cpp Modified: cfe/trunk/lib/AST/ItaniumMangle.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ItaniumMangle.cpp?rev=267969&r1=267968&r2=267969&view=diff ============================================================================== --- cfe/trunk/lib/AST/ItaniumMangle.cpp (original) +++ cfe/trunk/lib/AST/ItaniumMangle.cpp Thu Apr 28 20:23:20 2016 @@ -79,7 +79,7 @@ static const DeclContext *getEffectiveDe if (FD->isExternC()) return FD->getASTContext().getTranslationUnitDecl(); - return DC; + return DC->getRedeclContext(); } static const DeclContext *getEffectiveParentContext(const DeclContext *DC) { Modified: cfe/trunk/test/CodeGenCXX/c-linkage.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/c-linkage.cpp?rev=267969&r1=267968&r2=267969&view=diff ============================================================================== --- cfe/trunk/test/CodeGenCXX/c-linkage.cpp (original) +++ cfe/trunk/test/CodeGenCXX/c-linkage.cpp Thu Apr 28 20:23:20 2016 @@ -15,10 +15,10 @@ extern "C" { extern "C" { static void test2_f() { } - // CHECK-LABEL: define internal {{.*}}void @_Z7test2_fv + // CHECK-LABEL: define internal {{.*}}void @_ZL7test2_fv static void test2_f(int x) { } - // CHECK-LABEL: define internal {{.*}}void @_Z7test2_fi + // CHECK-LABEL: define internal {{.*}}void @_ZL7test2_fi void test2_use() { test2_f(); test2_f(42); Modified: cfe/trunk/test/CodeGenCXX/extern-c.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/extern-c.cpp?rev=267969&r1=267968&r2=267969&view=diff ============================================================================== --- cfe/trunk/test/CodeGenCXX/extern-c.cpp (original) +++ cfe/trunk/test/CodeGenCXX/extern-c.cpp Thu Apr 28 20:23:20 2016 @@ -16,8 +16,23 @@ extern "C" struct d; // CHECK-NOT: should_not_appear extern "C++" int should_not_appear; +// CHECK: @_ZN3foo10extern_cxxE = global +extern "C++" int extern_cxx = 0; + } +// CHECK-NOT: @global_a = global +extern "C" int global_a; + +// CHECK: @global_b = global +extern "C" int global_b = 0; + +// CHECK-NOT: should_not_appear +extern "C++" int should_not_appear; + +// CHECK: @extern_cxx = global +extern "C++" int extern_cxx = 0; + namespace test1 { namespace { struct X {}; @@ -59,10 +74,10 @@ extern "C" { // CHECK-NOT: @unused // CHECK-NOT: @duplicate_internal - // CHECK: @internal_var = internal alias i32, i32* @_Z12internal_var + // CHECK: @internal_var = internal alias i32, i32* @_ZL12internal_var // CHECK-NOT: @unused // CHECK-NOT: @duplicate_internal - // CHECK: @internal_fn = internal alias i32 (), i32 ()* @_Z11internal_fnv + // CHECK: @internal_fn = internal alias i32 (), i32 ()* @_ZL11internal_fnv // CHECK-NOT: @unused // CHECK-NOT: @duplicate_internal } _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits