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 { footest0::__anon112fed88010813 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::__anon112fed88020825 template <unsigned n> void *foo() { return 0; } 26 footest1::__anon112fed88020827 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::__anon112fed880308::B43 void *foo() { return 0; } 44 }; 45 footest2::__anon112fed88030846 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__anon112fed880611::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::__anon112fed880708113 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