[clang] Implement lifetime analysis for lifetime_capture_by(X) (#115921)
[llvm-project.git] / clang / test / SemaCXX / linkage.cpp
blob74b991a398c9140fe329f83db3121cecaddabe55
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.
6 // RUN: %clang_cc1 -Werror -Wno-non-c-typedef-for-linkage -triple x86_64-apple-darwin10 -emit-llvm %s -o - | FileCheck %s
8 // CHECK: @_ZZN5test61A3fooEvE3bar = linkonce_odr global i32 0, align 4
10 // PR8926
11 namespace test0 {
12 typedef struct {
13 void *foo() { return 0; }
14 } A;
16 // CHECK: define linkonce_odr noundef ptr @_ZN5test01A3fooEv(
18 void test(A *a) {
19 a->foo();
23 namespace test1 {
24 typedef struct {
25 template <unsigned n> void *foo() { return 0; }
27 void foo() {
28 foo<0>();
30 } A;
32 // CHECK: define linkonce_odr void @_ZN5test11A3fooEv(
33 // another at the end
35 void test(A *a) {
36 a->foo();
40 namespace test2 {
41 typedef struct {
42 template <unsigned n> struct B {
43 void *foo() { return 0; }
46 void foo(B<0> *b) {
47 b->foo();
49 } A;
51 // CHECK: define linkonce_odr void @_ZN5test21A3fooEPNS0_1BILj0EEE(
53 void test(A *a) {
54 a->foo(0);
58 namespace test3 {
59 namespace { struct A {}; }
61 // CHECK: define internal void @_ZN5test34testENS_12_GLOBAL__N_11AE(
62 void test(A a) {}
63 void force() { test(A()); }
65 // CHECK: define{{.*}} void @test3(
66 extern "C" void test3(A a) {}
69 namespace {
70 // CHECK: define{{.*}} void @test4(
71 extern "C" void test4(void) {}
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;
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, ptr @a,
87 return g() + a;
91 // Force the above function to be emitted by codegen.
92 int test(X& x) {
93 return x.f();
97 // CHECK: define linkonce_odr noundef ptr @_ZN5test11A3fooILj0EEEPvv(
98 // CHECK: define linkonce_odr noundef ptr @_ZN5test21A1BILj0EE3fooEv(
100 namespace test5 {
101 struct foo {
103 extern "C" {
104 const foo bar[] = {
109 // Test that we don't compute linkage too hastily before we're done
110 // processing a record decl.
111 namespace test6 {
112 typedef struct {
113 int foo() {
114 // Tested at top of file.
115 static int bar = 0;
116 return bar++;
118 } A;
120 void test() {
121 A a;
122 a.foo();