Clang Project

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