1 // This is an IR generation test because the calculation of visibility
2 // during IR gen will cause linkage to be implicitly recomputed and
3 // compared against the earlier cached value.  If we had a way of
4 // testing linkage directly in Sema, that would be better.
5 
6 // RUN: %clang_cc1 -Werror -Wno-non-c-typedef-for-linkage -triple x86_64-apple-darwin10 -emit-llvm %s -o - | FileCheck %s
7 
8 // CHECK: @_ZZN5test61A3fooEvE3bar = linkonce_odr global i32 0, align 4
9 
10 // PR8926
11 namespace test0 {
12   typedef struct {
footest0::__anon91de3f34010813     void *foo() { return 0; }
14   } A;
15 
16   // CHECK: define linkonce_odr i8* @_ZN5test01A3fooEv(
17 
test(A * a)18   void test(A *a) {
19     a->foo();
20   }
21 }
22 
23 namespace test1 {
24   typedef struct {
footest1::__anon91de3f34020825     template <unsigned n> void *foo() { return 0; }
26 
footest1::__anon91de3f34020827     void foo() {
28       foo<0>();
29     }
30   } A;
31 
32   // CHECK: define linkonce_odr void @_ZN5test11A3fooEv(
33   // another at the end
34 
test(A * a)35   void test(A *a) {
36     a->foo();
37   }
38 }
39 
40 namespace test2 {
41   typedef struct {
42     template <unsigned n> struct B {
footest2::__anon91de3f340308::B43       void *foo() { return 0; }
44     };
45 
footest2::__anon91de3f34030846     void foo(B<0> *b) {
47       b->foo();
48     }
49   } A;
50 
51   // CHECK: define linkonce_odr void @_ZN5test21A3fooEPNS0_1BILj0EEE(
52 
test(A * a)53   void test(A *a) {
54     a->foo(0);
55   }
56 }
57 
58 namespace test3 {
59   namespace { struct A {}; }
60 
61   // CHECK: define internal void @_ZN5test34testENS_12_GLOBAL__N_11AE(
test(A a)62   void test(A a) {}
force()63   void force() { test(A()); }
64 
65   // CHECK: define{{.*}} void @test3(
test3(A a)66   extern "C" void test3(A a) {}
67 }
68 
69 namespace {
70   // CHECK: define{{.*}} void @test4(
test4(void)71   extern "C" void test4(void) {}
72 }
73 
74 // PR9316: Ensure that even non-namespace-scope function declarations in
75 // a C declaration context respect that over the anonymous namespace.
76 extern "C" {
77   namespace {
78     struct X {
f__anon91de3f340611::X79       int f() {
80         extern int g();
81         extern int a;
82 
83         // Test both for mangling in the code generation and warnings from use
84         // of internal, undefined names via -Werror.
85         // CHECK: call i32 @g(
86         // CHECK: load i32, i32* @a,
87         return g() + a;
88       }
89     };
90   }
91   // Force the above function to be emitted by codegen.
test(X & x)92   int test(X& x) {
93     return x.f();
94   }
95 }
96 
97 // CHECK: define linkonce_odr i8* @_ZN5test11A3fooILj0EEEPvv(
98 // CHECK: define linkonce_odr i8* @_ZN5test21A1BILj0EE3fooEv(
99 
100 namespace test5 {
101   struct foo {
102   };
103   extern "C" {
104     const foo bar[]  = {
105     };
106   }
107 }
108 
109 // Test that we don't compute linkage too hastily before we're done
110 // processing a record decl.  rdar://15928125
111 namespace test6 {
112   typedef struct {
footest6::__anon91de3f340708113     int foo() {
114       // Tested at top of file.
115       static int bar = 0;
116       return bar++;
117     }
118   } A;
119 
test()120   void test() {
121     A a;
122     a.foo();
123   }
124 }
125