xref: /aosp_15_r20/external/clang/test/CodeGenObjC/block-byref-variable-layout.m (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li// RUN: %clang_cc1 -fblocks -fobjc-arc -fobjc-runtime-has-weak -triple x86_64-apple-darwin -emit-llvm %s -o - | FileCheck %s
2*67e74705SXin Li
3*67e74705SXin Li// rdar://12759433
4*67e74705SXin Li@class NSString;
5*67e74705SXin Li
6*67e74705SXin Livoid Test12759433() {
7*67e74705SXin Li __block __unsafe_unretained NSString *uuByref = (__bridge NSString *)(void*)0x102030405060708;
8*67e74705SXin Li void (^block)() = ^{ uuByref = 0; };
9*67e74705SXin Li block();
10*67e74705SXin Li}
11*67e74705SXin Li// CHECK: %struct.__block_byref_uuByref = type { i8*, %struct.__block_byref_uuByref*, i32, i32, [[ZERO:%.*]]* }
12*67e74705SXin Liint main() {
13*67e74705SXin Li  __block __weak id wid;
14*67e74705SXin Li  __block long XXX;
15*67e74705SXin Li  __block id ID;
16*67e74705SXin Li  __block struct S {
17*67e74705SXin Li     int iS;
18*67e74705SXin Li     double iD;
19*67e74705SXin Li     void *pv;
20*67e74705SXin Li     __unsafe_unretained id unsunr;
21*67e74705SXin Li  } import;
22*67e74705SXin Li  void (^c)() = ^{
23*67e74705SXin Li// Inline flag for BYREF variable layout (1107296256): BLOCK_BYREF_HAS_COPY_DISPOSE BLOCK_BYREF_LAYOUT_WEAK
24*67e74705SXin Li// CHECK: store i32 1107296256, i32* [[T0:%.*]]
25*67e74705SXin Li  wid = 0;
26*67e74705SXin Li
27*67e74705SXin Li// Inline flag for BYREF variable layout (536870912): BLOCK_BYREF_LAYOUT_NON_OBJECT
28*67e74705SXin Li// CHECK: store i32 536870912, i32* [[T1:%.*]]
29*67e74705SXin Li    XXX = 12345;
30*67e74705SXin Li
31*67e74705SXin Li// Inline flag for BYREF variable layout (838860800): BLOCK_BYREF_HAS_COPY_DISPOSE BLOCK_BYREF_LAYOUT_STRONG
32*67e74705SXin Li// CHECK: store i32 838860800, i32* [[T2:%.*]]
33*67e74705SXin Li    ID = 0;
34*67e74705SXin Li
35*67e74705SXin Li// Inline flag for BYREF variable layout (268435456): BLOCK_BYREF_LAYOUT_EXTENDED
36*67e74705SXin Li// BYREF variable layout: BL_NON_OBJECT_WORD:3, BL_UNRETAINED:1, BL_OPERATOR:0
37*67e74705SXin Li// CHECK: store i32 268435456, i32* [[T3:%.*]]
38*67e74705SXin Li    import.iD = 3.14;
39*67e74705SXin Li
40*67e74705SXin Li  };
41*67e74705SXin Li  c();
42*67e74705SXin Li}
43*67e74705SXin Li
44*67e74705SXin Li// rdar://12787751
45*67e74705SXin Litypedef char mds_path_t[1024];
46*67e74705SXin Livoid directVolumePerfWaitForStoreState()
47*67e74705SXin Li{
48*67e74705SXin Li __block mds_path_t path;
49*67e74705SXin Li}
50