blob: 8a2013fd52b421ad2df1e7f4cb75fc3b7c49af06 [file] [log] [blame]
John McCallf9536f42011-02-08 22:28:39 +00001// 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
Chandler Carruth10aad442011-02-25 00:05:02 +00006// RUN: %clang_cc1 -Werror -triple x86_64-apple-darwin10 -emit-llvm %s -o - | FileCheck %s
John McCallf9536f42011-02-08 22:28:39 +00007
Stephen Hines651f13c2014-04-23 16:59:28 -07008// CHECK: @_ZZN5test61A3fooEvE3bar = linkonce_odr global i32 0, align 4
9
John McCallf9536f42011-02-08 22:28:39 +000010// PR8926
11namespace 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
23namespace 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
40namespace 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
John McCallaf8ca372011-02-10 06:50:24 +000058namespace 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
Chandler Carruth094b6432011-02-24 19:03:39 +000069namespace {
70 // CHECK: define void @test4(
71 extern "C" void test4(void) {}
72}
73
Chandler Carruth10aad442011-02-25 00:05:02 +000074// PR9316: Ensure that even non-namespace-scope function declarations in
75// a C declaration context respect that over the anonymous namespace.
76extern "C" {
77 namespace {
78 struct X {
79 int f() {
80 extern int g();
Eli Friedman750dc2b2012-01-15 01:23:58 +000081 extern int a;
Chandler Carruth10aad442011-02-25 00:05:02 +000082
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(
Eli Friedman750dc2b2012-01-15 01:23:58 +000086 // CHECK: load i32* @a,
87 return g() + a;
Chandler Carruth10aad442011-02-25 00:05:02 +000088 }
89 };
90 }
91 // Force the above function to be emitted by codegen.
92 int test(X& x) {
93 return x.f();
94 }
95}
96
John McCallf9536f42011-02-08 22:28:39 +000097// CHECK: define linkonce_odr i8* @_ZN5test21A1BILj0EE3fooEv(
98// CHECK: define linkonce_odr i8* @_ZN5test11A3fooILj0EEEPvv(
Rafael Espindola88e37c22013-04-26 00:29:11 +000099
100namespace test5 {
101 struct foo {
102 };
103 extern "C" {
104 const foo bar[] = {
105 };
106 }
107}
Stephen Hines651f13c2014-04-23 16:59:28 -0700108
109// Test that we don't compute linkage too hastily before we're done
110// processing a record decl. rdar://15928125
111namespace 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}