blob: 76b7cfd118b503f600f89836aa3f6ff22f5fa8e5 [file] [log] [blame]
John McCall460ce582015-10-22 18:38:17 +00001// 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
John McCall7f416cc2015-09-08 08:05:57 +00002// RUN: FileCheck -check-prefix=CHECK -check-prefix=CHECK-64 --input-file=%t-64.layout %s
John McCall460ce582015-10-22 18:38:17 +00003// 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
John McCall7f416cc2015-09-08 08:05:57 +00004// RUN: FileCheck -check-prefix=CHECK -check-prefix=CHECK-32 --input-file=%t-32.layout %s
Fariborz Jahanianc8892052013-01-17 00:25:06 +00005// rdar://12184410
Fariborz Jahanian2dd78192012-11-02 22:51:18 +00006// rdar://12184410
7
8void x(id y) {}
9void y(int a) {}
10
11extern id opaque_id();
12__weak id wid;
13
14void f() {
15 __block int byref_int = 0;
16 const id bar = (id) opaque_id();
17 id baz = 0;
18 __strong id strong_void_sta;
19 __block id byref_bab = (id)0;
20 __block id bl_var1;
21
Fariborz Jahaniana9d44642012-11-14 17:15:51 +000022// block variable layout: BL_STRONG:1, BL_OPERATOR:0
John McCall7f416cc2015-09-08 08:05:57 +000023// CHECK: Inline block variable layout: 0x0100, BL_STRONG:1, BL_OPERATOR:0
Fariborz Jahanian2dd78192012-11-02 22:51:18 +000024 void (^b)() = ^{
25 x(bar);
26 };
27
Fariborz Jahaniana9d44642012-11-14 17:15:51 +000028// block variable layout: BL_STRONG:2, BL_BYREF:1, BL_OPERATOR:0
John McCall7f416cc2015-09-08 08:05:57 +000029// CHECK: Inline block variable layout: 0x0210, BL_STRONG:2, BL_BYREF:1, BL_OPERATOR:0
Fariborz Jahanian2dd78192012-11-02 22:51:18 +000030 void (^c)() = ^{
31 x(bar);
32 x(baz);
33 byref_int = 1;
34 };
35
Fariborz Jahaniana9d44642012-11-14 17:15:51 +000036// block variable layout: BL_STRONG:2, BL_BYREF:3, BL_OPERATOR:0
John McCall7f416cc2015-09-08 08:05:57 +000037// CHECK: Inline block variable layout: 0x0230, BL_STRONG:2, BL_BYREF:3, BL_OPERATOR:0
Fariborz Jahanian2dd78192012-11-02 22:51:18 +000038 void (^d)() = ^{
39 x(bar);
40 x(baz);
41 byref_int = 1;
42 bl_var1 = 0;
43 byref_bab = 0;
44 };
45
Fariborz Jahaniana9d44642012-11-14 17:15:51 +000046// block variable layout: BL_STRONG:2, BL_BYREF:3, BL_OPERATOR:0
John McCall7f416cc2015-09-08 08:05:57 +000047// CHECK: Inline block variable layout: 0x0230, BL_STRONG:2, BL_BYREF:3, BL_OPERATOR:0
Fariborz Jahanian2dd78192012-11-02 22:51:18 +000048 id (^e)() = ^{
49 x(bar);
50 x(baz);
51 byref_int = 1;
52 bl_var1 = 0;
53 byref_bab = 0;
54 return wid;
55 };
56
John McCall7f416cc2015-09-08 08:05:57 +000057// CHECK: Inline block variable layout: 0x020, BL_BYREF:2, BL_OPERATOR:0
Fariborz Jahanian2dd78192012-11-02 22:51:18 +000058 void (^ii)() = ^{
59 byref_int = 1;
60 byref_bab = 0;
61 };
62}