xref: /aosp_15_r20/external/clang/test/CodeGenObjC/arc-captured-block-var-inlined-layout.m (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li// RUN: %clang_cc1 -fblocks -fobjc-arc -fobjc-runtime-has-weak -triple x86_64-apple-darwin -print-ivar-layout -emit-llvm -o /dev/null %s > %t-64.layout
2*67e74705SXin Li// RUN: FileCheck -check-prefix=CHECK -check-prefix=CHECK-64 --input-file=%t-64.layout %s
3*67e74705SXin Li// RUN: %clang_cc1 -fblocks -fobjc-arc -fobjc-runtime-has-weak -triple i386-apple-darwin -print-ivar-layout -emit-llvm -o /dev/null  %s > %t-32.layout
4*67e74705SXin Li// RUN: FileCheck -check-prefix=CHECK -check-prefix=CHECK-32 --input-file=%t-32.layout %s
5*67e74705SXin Li// rdar://12184410
6*67e74705SXin Li
7*67e74705SXin Livoid x(id y) {}
8*67e74705SXin Livoid y(int a) {}
9*67e74705SXin Li
10*67e74705SXin Liextern id opaque_id();
11*67e74705SXin Li
12*67e74705SXin Livoid f() {
13*67e74705SXin Li    __block int byref_int = 0;
14*67e74705SXin Li    const id bar = (id) opaque_id();
15*67e74705SXin Li    id baz = 0;
16*67e74705SXin Li    __strong id strong_void_sta;
17*67e74705SXin Li    __block id byref_bab = (id)0;
18*67e74705SXin Li    __block id bl_var1;
19*67e74705SXin Li
20*67e74705SXin Li// CHECK: Inline block variable layout: 0x0100, BL_STRONG:1, BL_OPERATOR:0
21*67e74705SXin Li    void (^b)() = ^{
22*67e74705SXin Li        x(bar);
23*67e74705SXin Li    };
24*67e74705SXin Li
25*67e74705SXin Li// CHECK: Inline block variable layout: 0x0210, BL_STRONG:2, BL_BYREF:1, BL_OPERATOR:0
26*67e74705SXin Li    void (^c)() = ^{
27*67e74705SXin Li        x(bar);
28*67e74705SXin Li        x(baz);
29*67e74705SXin Li        byref_int = 1;
30*67e74705SXin Li    };
31*67e74705SXin Li
32*67e74705SXin Li// CHECK: Inline block variable layout: 0x0230, BL_STRONG:2, BL_BYREF:3, BL_OPERATOR:0
33*67e74705SXin Li    void (^d)() = ^{
34*67e74705SXin Li        x(bar);
35*67e74705SXin Li        x(baz);
36*67e74705SXin Li        byref_int = 1;
37*67e74705SXin Li        bl_var1 = 0;
38*67e74705SXin Li        byref_bab = 0;
39*67e74705SXin Li    };
40*67e74705SXin Li
41*67e74705SXin Li// CHECK: Inline block variable layout: 0x0231, BL_STRONG:2, BL_BYREF:3, BL_WEAK:1, BL_OPERATOR:0
42*67e74705SXin Li    __weak id wid;
43*67e74705SXin Li    id (^e)() = ^{
44*67e74705SXin Li        x(bar);
45*67e74705SXin Li        x(baz);
46*67e74705SXin Li        byref_int = 1;
47*67e74705SXin Li        bl_var1 = 0;
48*67e74705SXin Li        byref_bab = 0;
49*67e74705SXin Li        return wid;
50*67e74705SXin Li    };
51*67e74705SXin Li
52*67e74705SXin Li// CHECK: Inline block variable layout: 0x0235, BL_STRONG:2, BL_BYREF:3, BL_WEAK:5, BL_OPERATOR:0
53*67e74705SXin Li    __weak id wid1, wid2, wid3, wid4;
54*67e74705SXin Li    id (^f)() = ^{
55*67e74705SXin Li        x(bar);
56*67e74705SXin Li        x(baz);
57*67e74705SXin Li        byref_int = 1;
58*67e74705SXin Li        bl_var1 = 0;
59*67e74705SXin Li        byref_bab = 0;
60*67e74705SXin Li        x(wid1);
61*67e74705SXin Li        x(wid2);
62*67e74705SXin Li        x(wid3);
63*67e74705SXin Li        x(wid4);
64*67e74705SXin Li        return wid;
65*67e74705SXin Li    };
66*67e74705SXin Li
67*67e74705SXin Li// CHECK: Inline block variable layout: 0x035, BL_BYREF:3, BL_WEAK:5, BL_OPERATOR:0
68*67e74705SXin Li    id (^g)() = ^{
69*67e74705SXin Li        byref_int = 1;
70*67e74705SXin Li        bl_var1 = 0;
71*67e74705SXin Li        byref_bab = 0;
72*67e74705SXin Li        x(wid1);
73*67e74705SXin Li        x(wid2);
74*67e74705SXin Li        x(wid3);
75*67e74705SXin Li        x(wid4);
76*67e74705SXin Li        return wid;
77*67e74705SXin Li    };
78*67e74705SXin Li
79*67e74705SXin Li// CHECK: Inline block variable layout: 0x01, BL_WEAK:1, BL_OPERATOR:0
80*67e74705SXin Li    id (^h)() = ^{
81*67e74705SXin Li        return wid;
82*67e74705SXin Li    };
83*67e74705SXin Li
84*67e74705SXin Li// CHECK: Inline block variable layout: 0x020, BL_BYREF:2, BL_OPERATOR:0
85*67e74705SXin Li    void (^ii)() = ^{
86*67e74705SXin Li       byref_int = 1;
87*67e74705SXin Li       byref_bab = 0;
88*67e74705SXin Li    };
89*67e74705SXin Li
90*67e74705SXin Li// CHECK: Inline block variable layout: 0x0102, BL_STRONG:1, BL_WEAK:2, BL_OPERATOR:0
91*67e74705SXin Li    void (^jj)() = ^{
92*67e74705SXin Li      x(bar);
93*67e74705SXin Li      x(wid1);
94*67e74705SXin Li      x(wid2);
95*67e74705SXin Li    };
96*67e74705SXin Li}
97*67e74705SXin Li
98*67e74705SXin Li// rdar://12752901
99*67e74705SXin Li@class NSString;
100*67e74705SXin Liextern void NSLog(NSString *format, ...);
101*67e74705SXin Litypedef void (^dispatch_block_t)(void);
102*67e74705SXin Liint main() {
103*67e74705SXin Li        __strong NSString *s1 = 0;
104*67e74705SXin Li        __strong NSString *s2 = 0;
105*67e74705SXin Li        __weak NSString *w1 = 0;
106*67e74705SXin Li
107*67e74705SXin Li
108*67e74705SXin Li// CHECK: Inline block variable layout: 0x0201, BL_STRONG:2, BL_WEAK:1, BL_OPERATOR:0
109*67e74705SXin Li        dispatch_block_t block2 = ^{
110*67e74705SXin Li                NSLog(@"%@, %@, %@", s1, w1, s2);
111*67e74705SXin Li        };
112*67e74705SXin Li}
113