blob: fa131f63bee5cb52782aea29fcc7b37ec66c32e4 [file] [log] [blame]
Fariborz Jahanian93ce50d2010-08-04 23:55:24 +00001// RUN: %clang_cc1 -fblocks -fobjc-gc -triple x86_64-apple-darwin -O0 -S %s -o %t-64.s
2// RUN: FileCheck -check-prefix LP64 --input-file=%t-64.s %s
Fariborz Jahanian93ce50d2010-08-04 23:55:24 +00003
Fariborz Jahaniane1a48982010-08-05 21:00:25 +00004struct S {
5 int i1;
6 id o1;
7 struct V {
8 int i2;
9 id o2;
10 } v1;
11 int i3;
12 id o3;
13};
14
Fariborz Jahanian93ce50d2010-08-04 23:55:24 +000015__weak id wid;
16void x(id y) {}
17void y(int a) {}
18
19void f() {
20 __block int byref_int = 0;
21 char ch = 'a';
22 char ch1 = 'b';
23 char ch2 = 'c';
24 short sh = 2;
25 const id bar = (id)0;
26 id baz = 0;
27 __strong void *strong_void_sta;
28 __block id byref_bab = (id)0;
29 __block void *bl_var1;
30 int i; double dob;
31
32 void (^b)() = ^{
33 byref_int = sh + ch+ch1+ch2 ;
34 x(bar);
35 x(baz);
36 x((id)strong_void_sta);
37 x(byref_bab);
38 };
39 b();
40
41// Test 2
42 void (^c)() = ^{
43 byref_int = sh + ch+ch1+ch2 ;
44 x(bar);
45 x(baz);
46 x((id)strong_void_sta);
47 x(wid);
48 bl_var1 = 0;
49 x(byref_bab);
50 };
51 c();
52
53// Test 3
54void (^d)() = ^{
55 byref_int = sh + ch+ch1+ch2 ;
56 x(bar);
57 x(baz);
58 x(wid);
59 bl_var1 = 0;
60 y(i + dob);
61 x(byref_bab);
62 };
63 d();
Fariborz Jahaniane1a48982010-08-05 21:00:25 +000064
65// Test4
66 struct S s2;
67 void (^e)() = ^{
68 x(s2.o1);
69 };
70 e();
Fariborz Jahanian93ce50d2010-08-04 23:55:24 +000071}
72
Fariborz Jahaniana1f024c2010-08-06 16:28:55 +000073// Test 5 (unions/structs and their nesting):
74void Test5() {
75struct S5 {
76 int i1;
77 id o1;
78 struct V {
79 int i2;
80 id o2;
81 } v1;
82 int i3;
83 union UI {
84 void * i1;
85 id o1;
86 int i3;
87 id o3;
88 }ui;
89};
90
91union U {
92 void * i1;
93 id o1;
94 int i3;
95 id o3;
96}ui;
97
98struct S5 s2;
99union U u2;
100void (^c)() = ^{
101 x(s2.ui.o1);
102 x(u2.o1);
103};
104c();
105
106}
107
Fariborz Jahanianc5904b42010-09-11 01:27:29 +0000108// rdar: //8417746
109void CFRelease(id);
110void notifyBlock(id dependentBlock) {
111 id singleObservationToken;
112 id token;
113 void (^b)();
114 void (^wrapperBlock)() = ^() {
115 CFRelease(singleObservationToken);
116 CFRelease(singleObservationToken);
117 CFRelease(token);
118 CFRelease(singleObservationToken);
119 b();
120 };
121 wrapperBlock();
122}
123
Fariborz Jahanianfb550312010-09-13 16:09:44 +0000124void test_empty_block() {
125 void (^wrapperBlock)() = ^() {
126 };
127 wrapperBlock();
128}
Fariborz Jahanianc5904b42010-09-11 01:27:29 +0000129
Fariborz Jahanian93ce50d2010-08-04 23:55:24 +0000130// CHECK-LP64: L_OBJC_CLASS_NAME_:
Fariborz Jahanian81979822010-09-09 00:21:45 +0000131// CHECK-LP64-NEXT: .asciz "\0011\024"
Fariborz Jahanian93ce50d2010-08-04 23:55:24 +0000132
133// CHECK-LP64: L_OBJC_CLASS_NAME_1:
Fariborz Jahanian81979822010-09-09 00:21:45 +0000134// CHECK-LP64-NEXT: .asciz "\0011\025"
Fariborz Jahanian93ce50d2010-08-04 23:55:24 +0000135
136// CHECK-LP64: L_OBJC_CLASS_NAME_6:
Fariborz Jahanian81979822010-09-09 00:21:45 +0000137// CHECK-LP64-NEXT: .asciz "\0011\023!"
Fariborz Jahanian93ce50d2010-08-04 23:55:24 +0000138
Fariborz Jahaniane1a48982010-08-05 21:00:25 +0000139// CHECK-LP64: L_OBJC_CLASS_NAME_11:
Fariborz Jahanian81979822010-09-09 00:21:45 +0000140// CHECK-LP64-NEXT: .asciz "\001A\021\021"
Fariborz Jahaniana1f024c2010-08-06 16:28:55 +0000141
142// CHECK-LP64: L_OBJC_CLASS_NAME_14:
Fariborz Jahanian81979822010-09-09 00:21:45 +0000143// CHECK-LP64-NEXT: .asciz "\001A\021\022p"
Fariborz Jahanianc5904b42010-09-11 01:27:29 +0000144
145// CHECK-LP64: L_OBJC_CLASS_NAME_16:
146// CHECK-LP64-NEXT: .asciz "\0013"
Fariborz Jahanianfb550312010-09-13 16:09:44 +0000147
148// CHECK-LP64: L_OBJC_CLASS_NAME_20:
149// CHECK-LP64-NEXT: .asciz "\001"