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 -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 { |
13 | void *foo() { return 0; } |
14 | } A; |
15 | |
16 | // CHECK: define linkonce_odr i8* @_ZN5test01A3fooEv( |
17 | |
18 | void test(A *a) { |
19 | a->foo(); |
20 | } |
21 | } |
22 | |
23 | namespace test1 { |
24 | typedef struct { |
25 | template <unsigned n> void *foo() { return 0; } |
26 | |
27 | void foo() { |
28 | foo<0>(); |
29 | } |
30 | } A; |
31 | |
32 | // CHECK: define linkonce_odr void @_ZN5test11A3fooEv( |
33 | // another at the end |
34 | |
35 | void test(A *a) { |
36 | a->foo(); |
37 | } |
38 | } |
39 | |
40 | namespace test2 { |
41 | typedef struct { |
42 | template <unsigned n> struct B { |
43 | void *foo() { return 0; } |
44 | }; |
45 | |
46 | void foo(B<0> *b) { |
47 | b->foo(); |
48 | } |
49 | } A; |
50 | |
51 | // CHECK: define linkonce_odr void @_ZN5test21A3fooEPNS0_1BILj0EEE( |
52 | |
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( |
62 | void test(A a) {} |
63 | void force() { test(A()); } |
64 | |
65 | // CHECK: define void @test3( |
66 | extern "C" void test3(A a) {} |
67 | } |
68 | |
69 | namespace { |
70 | // CHECK: define void @test4( |
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 { |
79 | 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. |
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 { |
113 | int foo() { |
114 | // Tested at top of file. |
115 | static int bar = 0; |
116 | return bar++; |
117 | } |
118 | } A; |
119 | |
120 | void test() { |
121 | A a; |
122 | a.foo(); |
123 | } |
124 | } |
125 | |