1*67e74705SXin Li // RUN: %clang_cc1 -triple %itanium_abi_triple -emit-llvm %s -o - | FileCheck %s 2*67e74705SXin Li namespace foo { 3*67e74705SXin Li 4*67e74705SXin Li // CHECK-NOT: @a = global 5*67e74705SXin Li extern "C" int a; 6*67e74705SXin Li 7*67e74705SXin Li // CHECK-NOT: @_ZN3foo1bE = global 8*67e74705SXin Li extern int b; 9*67e74705SXin Li 10*67e74705SXin Li // CHECK: @_ZN3foo1cE = global 11*67e74705SXin Li int c = 5; 12*67e74705SXin Li 13*67e74705SXin Li // CHECK-NOT: @_ZN3foo1dE 14*67e74705SXin Li extern "C" struct d; 15*67e74705SXin Li 16*67e74705SXin Li // CHECK-NOT: should_not_appear 17*67e74705SXin Li extern "C++" int should_not_appear; 18*67e74705SXin Li 19*67e74705SXin Li // CHECK: @_ZN3foo10extern_cxxE = global 20*67e74705SXin Li extern "C++" int extern_cxx = 0; 21*67e74705SXin Li 22*67e74705SXin Li } 23*67e74705SXin Li 24*67e74705SXin Li // CHECK-NOT: @global_a = global 25*67e74705SXin Li extern "C" int global_a; 26*67e74705SXin Li 27*67e74705SXin Li // CHECK: @global_b = global 28*67e74705SXin Li extern "C" int global_b = 0; 29*67e74705SXin Li 30*67e74705SXin Li // CHECK-NOT: should_not_appear 31*67e74705SXin Li extern "C++" int should_not_appear; 32*67e74705SXin Li 33*67e74705SXin Li // CHECK: @extern_cxx = global 34*67e74705SXin Li extern "C++" int extern_cxx = 0; 35*67e74705SXin Li 36*67e74705SXin Li namespace test1 { 37*67e74705SXin Li namespace { 38*67e74705SXin Li struct X {}; 39*67e74705SXin Li } 40*67e74705SXin Li extern "C" { 41*67e74705SXin Li // CHECK: @test1_b = global 42*67e74705SXin Li X test1_b = X(); 43*67e74705SXin Li } 44*67e74705SXin Li void *use = &test1_b; 45*67e74705SXin Li // CHECK: @_ZN5test13useE = global 46*67e74705SXin Li } 47*67e74705SXin Li 48*67e74705SXin Li namespace test2 { 49*67e74705SXin Li namespace { 50*67e74705SXin Li struct X {}; 51*67e74705SXin Li } 52*67e74705SXin Li 53*67e74705SXin Li // CHECK: @test2_b = global 54*67e74705SXin Li extern "C" X test2_b; 55*67e74705SXin Li X test2_b; 56*67e74705SXin Li } 57*67e74705SXin Li 58*67e74705SXin Li extern "C" { 59*67e74705SXin Li static int unused_var; unused_fn()60*67e74705SXin Li static int unused_fn() { return 0; } 61*67e74705SXin Li 62*67e74705SXin Li __attribute__((used)) static int internal_var; internal_fn()63*67e74705SXin Li __attribute__((used)) static int internal_fn() { return 0; } 64*67e74705SXin Li 65*67e74705SXin Li __attribute__((used)) static int duplicate_internal_var; duplicate_internal_fn()66*67e74705SXin Li __attribute__((used)) static int duplicate_internal_fn() { return 0; } 67*67e74705SXin Li 68*67e74705SXin Li namespace N { 69*67e74705SXin Li __attribute__((used)) static int duplicate_internal_var; duplicate_internal_fn()70*67e74705SXin Li __attribute__((used)) static int duplicate_internal_fn() { return 0; } 71*67e74705SXin Li } 72*67e74705SXin Li 73*67e74705SXin Li // CHECK: @llvm.used = appending global {{.*}} @internal_var {{.*}} @internal_fn 74*67e74705SXin Li 75*67e74705SXin Li // CHECK-NOT: @unused 76*67e74705SXin Li // CHECK-NOT: @duplicate_internal 77*67e74705SXin Li // CHECK: @internal_var = internal alias i32, i32* @_ZL12internal_var 78*67e74705SXin Li // CHECK-NOT: @unused 79*67e74705SXin Li // CHECK-NOT: @duplicate_internal 80*67e74705SXin Li // CHECK: @internal_fn = internal alias i32 (), i32 ()* @_ZL11internal_fnv 81*67e74705SXin Li // CHECK-NOT: @unused 82*67e74705SXin Li // CHECK-NOT: @duplicate_internal 83*67e74705SXin Li } 84*67e74705SXin Li 85*67e74705SXin Li namespace PR19411 { 86*67e74705SXin Li struct A { void f(); }; f()87*67e74705SXin Li extern "C" void A::f() { void g(); g(); } 88*67e74705SXin Li // CHECK-LABEL: @_ZN7PR194111A1fEv( 89*67e74705SXin Li // CHECK: call {{.*}}void @g() 90*67e74705SXin Li } 91