[clang] Implement lifetime analysis for lifetime_capture_by(X) (#115921)
[llvm-project.git] / clang / test / CodeGenObjCXX / mangle-blocks.mm
blob3110ae7d9b7c3cc44b1ae6c92ffd60f2b4d2ae5a
1 // RUN: %clang_cc1 -emit-llvm -fblocks -o - -triple x86_64-apple-darwin10 -fobjc-runtime=macosx-fragile-10.5 %s | FileCheck %s
3 // CHECK-DAG: @_ZZZN26externally_visible_statics1S3fooEiEd_Ub_E1k = linkonce_odr global i32 0
4 // CHECK-DAG: @_ZZZN26externally_visible_statics10inlinefuncEvEUb_E1i = linkonce_odr global i32 0
5 // CHECK-DAG: @_ZZZN26externally_visible_statics10inlinefuncEvEUb0_E1j = linkonce_odr global i32 0
6 // CHECK-DAG: @_ZZ26externally_visible_statics1S1xMUb_E1j = linkonce_odr global i32 0
8 int f();
10 void foo() {
11   // CHECK-LABEL: define internal noundef i32 @___Z3foov_block_invoke
12   // CHECK: call i32 @__cxa_guard_acquire(ptr @_ZGVZZ3foovEUb_E5value
13   (void)^(int x) { 
14     static int value = f();
15     return x + value;
16   };
19 // CHECK-LABEL: define internal noundef i32 @i_block_invoke
20 int i = ^(int x) { return x;}(i);
22 @interface A
23 - (void)method;
24 @end
26 @implementation A
27 - (void)method { 
28   // CHECK: define internal noundef signext i8 @"__11-[A method]_block_invoke"
29   (void)^(int x) {
30     // CHECK: @"_ZZZ11-[A method]EUb1_E4name"
31     static const char *name = "hello";
32     return name[x];
33   };
35 @end
37 void foo(int) {
38   (void)^(int x) { 
39     static const char *name = "hello";
40     return name[x];
41   };
44 namespace N {
45   // CHECK-LABEL: define internal noundef signext i8 @___Z3fooi_block_invoke
46   void bar() {
47     (void)^(int x) { 
48       // CHECK: @_ZZZN1N3barEvEUb3_E4name
49       static const char *name = "hello";
50       return name[x];
51     };
52   }
55 class C {
56   C();
58 C::C() {
59   (void)^(int x) { 
60     // CHECK: @_ZZZN1CC1EvEUb4_E5nameb
61     static const char *nameb = "hello";
62     return nameb[x];
63   };
66 int f();
67 namespace externally_visible_statics {
68   inline void inlinefunc() {
69     ^{
70       static int i = f();
71     }();
72     ^{
73       static int j = f();
74     }();
75   }
76   struct S {
77     int x = ^{
78       static int j = f();
79       return j;
80     }();
81     void foo(int y = ^{ static int k = f(); return k; }()) {}
82   };
83   void g() {
84     inlinefunc();
85     S s;
86     s.foo();
87   }