// This is an IR generation test because the calculation of visibility // during IR gen will cause linkage to be implicitly recomputed and // compared against the earlier cached value. If we had a way of // testing linkage directly in Sema, that would be better. // RUN: %clang_cc1 -Werror -Wno-non-c-typedef-for-linkage -triple x86_64-apple-darwin10 -emit-llvm %s -o - | FileCheck %s // CHECK: @_ZZN5test61A3fooEvE3bar = linkonce_odr global i32 0, align 4 // PR8926 namespace test0 { typedef struct { void *foo() { return 0; } } A; // CHECK: define linkonce_odr noundef ptr @_ZN5test01A3fooEv( void test(A *a) { a->foo(); } } namespace test1 { typedef struct { template void *foo() { return 0; } void foo() { foo<0>(); } } A; // CHECK: define linkonce_odr void @_ZN5test11A3fooEv( // another at the end void test(A *a) { a->foo(); } } namespace test2 { typedef struct { template struct B { void *foo() { return 0; } }; void foo(B<0> *b) { b->foo(); } } A; // CHECK: define linkonce_odr void @_ZN5test21A3fooEPNS0_1BILj0EEE( void test(A *a) { a->foo(0); } } namespace test3 { namespace { struct A {}; } // CHECK: define internal void @_ZN5test34testENS_12_GLOBAL__N_11AE( void test(A a) {} void force() { test(A()); } // CHECK: define{{.*}} void @test3( extern "C" void test3(A a) {} } namespace { // CHECK: define{{.*}} void @test4( extern "C" void test4(void) {} } // PR9316: Ensure that even non-namespace-scope function declarations in // a C declaration context respect that over the anonymous namespace. extern "C" { namespace { struct X { int f() { extern int g(); extern int a; // Test both for mangling in the code generation and warnings from use // of internal, undefined names via -Werror. // CHECK: call i32 @g( // CHECK: load i32, ptr @a, return g() + a; } }; } // Force the above function to be emitted by codegen. int test(X& x) { return x.f(); } } // CHECK: define linkonce_odr noundef ptr @_ZN5test11A3fooILj0EEEPvv( // CHECK: define linkonce_odr noundef ptr @_ZN5test21A1BILj0EE3fooEv( namespace test5 { struct foo { }; extern "C" { const foo bar[] = { }; } } // Test that we don't compute linkage too hastily before we're done // processing a record decl. namespace test6 { typedef struct { int foo() { // Tested at top of file. static int bar = 0; return bar++; } } A; void test() { A a; a.foo(); } }