blob: 0a9a8178e700b42ecc97f7659b84ed359562ecc3 [file] [log] [blame]
Fariborz Jahaniane27e9d62010-11-11 00:11:38 +00001// RUN: %clang_cc1 -x objective-c++ -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
3
4
5struct S {
6 int i1;
7 id o1;
8 struct V {
9 int i2;
10 id o2;
11 } v1;
12 int i3;
13 id o3;
14};
15
16__weak id wid;
17void x(id y) {}
18void y(int a) {}
19
20void f() {
21 __block int byref_int = 0;
22 char ch = 'a';
23 char ch1 = 'b';
24 char ch2 = 'c';
25 short sh = 2;
26 const id bar = (id)0;
27 id baz = 0;
28 __strong void *strong_void_sta;
29 __block id byref_bab = (id)0;
30 __block void *bl_var1;
31 int i; double dob;
32
33 void (^b)() = ^{
34 byref_int = sh + ch+ch1+ch2 ;
35 x(bar);
36 x(baz);
37 x((id)strong_void_sta);
38 x(byref_bab);
39 };
40 b();
41
42// Test 2
43 void (^c)() = ^{
44 byref_int = sh + ch+ch1+ch2 ;
45 x(bar);
46 x(baz);
47 x((id)strong_void_sta);
48 x(wid);
49 bl_var1 = 0;
50 x(byref_bab);
51 };
52 c();
53
54// Test 3
55void (^d)() = ^{
56 byref_int = sh + ch+ch1+ch2 ;
57 x(bar);
58 x(baz);
59 x(wid);
60 bl_var1 = 0;
61 y(i + dob);
62 x(byref_bab);
63 };
64 d();
65
66// Test4
67 struct S s2;
68 void (^e)() = ^{
69 x(s2.o1);
70 };
71 e();
72}
73
74// Test 5 (unions/structs and their nesting):
75void Test5() {
76struct S5 {
77 int i1;
78 id o1;
79 struct V {
80 int i2;
81 id o2;
82 } v1;
83 int i3;
84 union UI {
85 void * i1;
86 id o1;
87 int i3;
88 id o3;
89 }ui;
90};
91
92union U {
93 void * i1;
94 id o1;
95 int i3;
96 id o3;
97}ui;
98
99struct S5 s2;
100union U u2;
101void (^c)() = ^{
102 x(s2.ui.o1);
103 x(u2.o1);
104};
105c();
106
107}
108
109// rdar: //8417746
110void CFRelease(id);
111void notifyBlock(id dependentBlock) {
112 id singleObservationToken;
113 id token;
114 void (^b)();
115 void (^wrapperBlock)() = ^() {
116 CFRelease(singleObservationToken);
117 CFRelease(singleObservationToken);
118 CFRelease(token);
119 CFRelease(singleObservationToken);
120 b();
121 };
122 wrapperBlock();
123}
124
125void test_empty_block() {
126 void (^wrapperBlock)() = ^() {
127 };
128 wrapperBlock();
129}
130
131// CHECK-LP64: L_OBJC_CLASS_NAME_:
132// CHECK-LP64-NEXT: .asciz "\0011\024"
133
134// CHECK-LP64: L_OBJC_CLASS_NAME_1:
135// CHECK-LP64-NEXT: .asciz "\0011\025"
136
137// CHECK-LP64: L_OBJC_CLASS_NAME_6:
138// CHECK-LP64-NEXT: .asciz "\0011\023!"
139
140// CHECK-LP64: L_OBJC_CLASS_NAME_11:
141// CHECK-LP64-NEXT: .asciz "\001A\021\021"
142
143// CHECK-LP64: L_OBJC_CLASS_NAME_16:
144// CHECK-LP64-NEXT: .asciz "\001A\021\022p"
145
146// CHECK-LP64: L_OBJC_CLASS_NAME_20:
147// CHECK-LP64-NEXT: .asciz "\0013"
148
149// CHECK-LP64: L_OBJC_CLASS_NAME_24:
150// CHECK-LP64-NEXT: .asciz "\001"