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