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