xref: /aosp_15_r20/external/clang/test/CodeGenObjC/mrr-captured-block-var-inlined-layout.m (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li// RUN: %clang_cc1 -fblocks -fobjc-runtime-has-weak -fobjc-arc -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-runtime-has-weak -fobjc-arc -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// rdar://12184410
7*67e74705SXin Li
8*67e74705SXin Livoid x(id y) {}
9*67e74705SXin Livoid y(int a) {}
10*67e74705SXin Li
11*67e74705SXin Liextern id opaque_id();
12*67e74705SXin Li__weak id wid;
13*67e74705SXin Li
14*67e74705SXin Livoid f() {
15*67e74705SXin Li    __block int byref_int = 0;
16*67e74705SXin Li    const id bar = (id) opaque_id();
17*67e74705SXin Li    id baz = 0;
18*67e74705SXin Li    __strong id strong_void_sta;
19*67e74705SXin Li    __block id byref_bab = (id)0;
20*67e74705SXin Li    __block id bl_var1;
21*67e74705SXin Li
22*67e74705SXin Li// block variable layout: BL_STRONG:1, BL_OPERATOR:0
23*67e74705SXin Li// CHECK: Inline block variable layout: 0x0100, BL_STRONG:1, BL_OPERATOR:0
24*67e74705SXin Li    void (^b)() = ^{
25*67e74705SXin Li        x(bar);
26*67e74705SXin Li    };
27*67e74705SXin Li
28*67e74705SXin Li// block variable layout: BL_STRONG:2, BL_BYREF:1, BL_OPERATOR:0
29*67e74705SXin Li// CHECK: Inline block variable layout: 0x0210, BL_STRONG:2, BL_BYREF:1, BL_OPERATOR:0
30*67e74705SXin Li    void (^c)() = ^{
31*67e74705SXin Li        x(bar);
32*67e74705SXin Li        x(baz);
33*67e74705SXin Li        byref_int = 1;
34*67e74705SXin Li    };
35*67e74705SXin Li
36*67e74705SXin Li// block variable layout: BL_STRONG:2, BL_BYREF:3, BL_OPERATOR:0
37*67e74705SXin Li// CHECK: Inline block variable layout: 0x0230, BL_STRONG:2, BL_BYREF:3, BL_OPERATOR:0
38*67e74705SXin Li    void (^d)() = ^{
39*67e74705SXin Li        x(bar);
40*67e74705SXin Li        x(baz);
41*67e74705SXin Li        byref_int = 1;
42*67e74705SXin Li        bl_var1 = 0;
43*67e74705SXin Li        byref_bab = 0;
44*67e74705SXin Li    };
45*67e74705SXin Li
46*67e74705SXin Li// block variable layout: BL_STRONG:2, BL_BYREF:3, BL_OPERATOR:0
47*67e74705SXin Li// CHECK: Inline block variable layout: 0x0230, BL_STRONG:2, BL_BYREF:3, BL_OPERATOR:0
48*67e74705SXin Li    id (^e)() = ^{
49*67e74705SXin Li        x(bar);
50*67e74705SXin Li        x(baz);
51*67e74705SXin Li        byref_int = 1;
52*67e74705SXin Li        bl_var1 = 0;
53*67e74705SXin Li        byref_bab = 0;
54*67e74705SXin Li        return wid;
55*67e74705SXin Li    };
56*67e74705SXin Li
57*67e74705SXin Li// CHECK: Inline block variable layout: 0x020, BL_BYREF:2, BL_OPERATOR:0
58*67e74705SXin Li    void (^ii)() = ^{
59*67e74705SXin Li       byref_int = 1;
60*67e74705SXin Li       byref_bab = 0;
61*67e74705SXin Li    };
62*67e74705SXin Li}
63