[Heikki Kultala] This patch contains the ABI changes for the TCE target.
[clang.git] / test / CodeGen / blocks-1.c
blob350f7a3bafb814e8eb9aaf30c499703c28809932
1 // RUN: %clang_cc1 %s -emit-llvm -o %t -fblocks
2 // RUN: grep "_Block_object_dispose" %t | count 17
3 // RUN: grep "__copy_helper_block_" %t | count 14
4 // RUN: grep "__destroy_helper_block_" %t | count 14
5 // RUN: grep "__Block_byref_object_copy_" %t | count 2
6 // RUN: grep "__Block_byref_object_dispose_" %t | count 2
7 // RUN: grep "i32 135)" %t | count 2
8 // RUN: grep "_Block_object_assign" %t | count 10
10 int printf(const char *, ...);
12 void test1() {
13 __block int a;
14 int b=2;
15 a=1;
16 printf("a is %d, b is %d\n", a, b);
17 ^{ a = 10; printf("a is %d, b is %d\n", a, b); }(); // needs copy/dispose
18 printf("a is %d, b is %d\n", a, b);
19 a = 1;
20 printf("a is %d, b is %d\n", a, b);
23 void test2() {
24 __block int a;
25 a=1;
26 printf("a is %d\n", a);
27 ^{ // needs copy/dispose
28 ^{ // needs copy/dispose
29 a = 10;
30 }();
31 }();
32 printf("a is %d\n", a);
33 a = 1;
34 printf("a is %d\n", a);
37 void test3() {
38 __block int k;
39 __block int (^j)(int);
40 ^{j=0; k=0;}(); // needs copy/dispose
43 int test4() {
44 extern int g;
45 static int i = 1;
46 ^(int j){ i = j; g = 0; }(0); // does not need copy/dispose
47 return i + g;
50 int g;
52 void test5() {
53 __block struct { int i; } i;
54 ^{ (void)i; }(); // needs copy/dispose
57 void test6() {
58 __block int i;
59 ^{ i=1; }(); // needs copy/dispose
60 ^{}(); // does not need copy/dispose
63 void test7() {
64 ^{ // does not need copy/dispose
65 __block int i;
66 ^{ i = 1; }(); // needs copy/dispose
67 }();
70 int main() {
71 int rv = 0;
72 test1();
73 test2();
74 test3();
75 rv += test4();
76 test5();
77 return rv;