xref: /aosp_15_r20/external/clang/test/CodeGen/blocks-1.c (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 %s -emit-llvm -o %t -fblocks
2*67e74705SXin Li // RUN: grep "_Block_object_dispose" %t | count 17
3*67e74705SXin Li // RUN: grep "__copy_helper_block_" %t | count 14
4*67e74705SXin Li // RUN: grep "__destroy_helper_block_" %t | count 14
5*67e74705SXin Li // RUN: grep "__Block_byref_object_copy_" %t | count 2
6*67e74705SXin Li // RUN: grep "__Block_byref_object_dispose_" %t | count 2
7*67e74705SXin Li // RUN: grep "i32 135)" %t | count 2
8*67e74705SXin Li // RUN: grep "_Block_object_assign" %t | count 10
9*67e74705SXin Li 
10*67e74705SXin Li int printf(const char *, ...);
11*67e74705SXin Li 
test1()12*67e74705SXin Li void test1() {
13*67e74705SXin Li   __block int a;
14*67e74705SXin Li   int b=2;
15*67e74705SXin Li   a=1;
16*67e74705SXin Li   printf("a is %d, b is %d\n", a, b);
17*67e74705SXin Li   ^{ a = 10; printf("a is %d, b is %d\n", a, b); }(); // needs copy/dispose
18*67e74705SXin Li   printf("a is %d, b is %d\n", a, b);
19*67e74705SXin Li   a = 1;
20*67e74705SXin Li   printf("a is %d, b is %d\n", a, b);
21*67e74705SXin Li }
22*67e74705SXin Li 
test2()23*67e74705SXin Li void test2() {
24*67e74705SXin Li   __block int a;
25*67e74705SXin Li   a=1;
26*67e74705SXin Li   printf("a is %d\n", a);
27*67e74705SXin Li   ^{ // needs copy/dispose
28*67e74705SXin Li     ^{ // needs copy/dispose
29*67e74705SXin Li       a = 10;
30*67e74705SXin Li     }();
31*67e74705SXin Li   }();
32*67e74705SXin Li   printf("a is %d\n", a);
33*67e74705SXin Li   a = 1;
34*67e74705SXin Li   printf("a is %d\n", a);
35*67e74705SXin Li }
36*67e74705SXin Li 
test3()37*67e74705SXin Li void test3() {
38*67e74705SXin Li   __block int k;
39*67e74705SXin Li   __block int (^j)(int);
40*67e74705SXin Li   ^{j=0; k=0;}(); // needs copy/dispose
41*67e74705SXin Li }
42*67e74705SXin Li 
test4()43*67e74705SXin Li int test4() {
44*67e74705SXin Li   extern int g;
45*67e74705SXin Li   static int i = 1;
46*67e74705SXin Li   ^(int j){ i = j; g = 0; }(0); // does not need copy/dispose
47*67e74705SXin Li   return i + g;
48*67e74705SXin Li }
49*67e74705SXin Li 
50*67e74705SXin Li int g;
51*67e74705SXin Li 
test5()52*67e74705SXin Li void test5() {
53*67e74705SXin Li   __block struct { int i; } i;
54*67e74705SXin Li   ^{ (void)i; }(); // needs copy/dispose
55*67e74705SXin Li }
56*67e74705SXin Li 
test6()57*67e74705SXin Li void test6() {
58*67e74705SXin Li   __block int i;
59*67e74705SXin Li   ^{ i=1; }(); // needs copy/dispose
60*67e74705SXin Li   ^{}(); // does not need copy/dispose
61*67e74705SXin Li }
62*67e74705SXin Li 
test7()63*67e74705SXin Li void test7() {
64*67e74705SXin Li   ^{ // does not need copy/dispose
65*67e74705SXin Li     __block int i;
66*67e74705SXin Li     ^{ i = 1; }(); // needs copy/dispose
67*67e74705SXin Li   }();
68*67e74705SXin Li }
69*67e74705SXin Li 
main()70*67e74705SXin Li int main() {
71*67e74705SXin Li   int rv = 0;
72*67e74705SXin Li   test1();
73*67e74705SXin Li   test2();
74*67e74705SXin Li   test3();
75*67e74705SXin Li   rv += test4();
76*67e74705SXin Li   test5();
77*67e74705SXin Li   return rv;
78*67e74705SXin Li }
79