125 lines · cpp
1// This is an IR generation test because the calculation of visibility2// during IR gen will cause linkage to be implicitly recomputed and3// compared against the earlier cached value. If we had a way of4// 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 %s7 8// CHECK: @_ZZN5test61A3fooEvE3bar = linkonce_odr global i32 0, align 49 10// PR892611namespace test0 {12 typedef struct {13 void *foo() { return 0; }14 } A;15 16 // CHECK: define linkonce_odr noundef ptr @_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 end34 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 58namespace 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 69namespace {70 // CHECK: define{{.*}} void @test4(71 extern "C" void test4(void) {}72}73 74// PR9316: Ensure that even non-namespace-scope function declarations in75// a C declaration context respect that over the anonymous namespace.76extern "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 use84 // of internal, undefined names via -Werror.85 // CHECK: call i32 @g(86 // CHECK: load i32, ptr @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 noundef ptr @_ZN5test11A3fooILj0EEEPvv(98// CHECK: define linkonce_odr noundef ptr @_ZN5test21A1BILj0EE3fooEv(99 100namespace 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 done110// processing a record decl.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}125