xref: /aosp_15_r20/external/clang/test/Sema/block-literal.c (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -fsyntax-only %s -verify -fblocks
2*67e74705SXin Li 
3*67e74705SXin Li void I( void (^)(void));
4*67e74705SXin Li void (^noop)(void);
5*67e74705SXin Li 
6*67e74705SXin Li void nothing();
7*67e74705SXin Li int printf(const char*, ...);
8*67e74705SXin Li 
9*67e74705SXin Li typedef void (^T) (void);
10*67e74705SXin Li 
11*67e74705SXin Li void takeblock(T);
12*67e74705SXin Li int takeintint(int (^C)(int)) { return C(4); }
13*67e74705SXin Li 
somefunction()14*67e74705SXin Li T somefunction() {
15*67e74705SXin Li   if (^{ })
16*67e74705SXin Li     nothing();
17*67e74705SXin Li 
18*67e74705SXin Li   noop = ^{};
19*67e74705SXin Li 
20*67e74705SXin Li   noop = ^{printf("\nClosure\n"); };
21*67e74705SXin Li 
22*67e74705SXin Li   I(^{ });
23*67e74705SXin Li 
24*67e74705SXin Li   return ^{printf("\nClosure\n"); };
25*67e74705SXin Li }
test2()26*67e74705SXin Li void test2() {
27*67e74705SXin Li   int x = 4;
28*67e74705SXin Li 
29*67e74705SXin Li   takeblock(^{ printf("%d\n", x); });
30*67e74705SXin Li 
31*67e74705SXin Li   while (1) {
32*67e74705SXin Li     takeblock(^{
33*67e74705SXin Li         break;  // expected-error {{'break' statement not in loop or switch statement}}
34*67e74705SXin Li         continue; // expected-error {{'continue' statement not in loop statement}}
35*67e74705SXin Li         while(1) break;  // ok
36*67e74705SXin Li         goto foo; // expected-error {{use of undeclared label 'foo'}}
37*67e74705SXin Li         a: goto a;       // ok
38*67e74705SXin Li       });
39*67e74705SXin Li     break;
40*67e74705SXin Li   }
41*67e74705SXin Li 
42*67e74705SXin Li   foo:
43*67e74705SXin Li   takeblock(^{ x = 4; });  // expected-error {{variable is not assignable (missing __block type specifier)}}
44*67e74705SXin Li   __block y = 7;    // expected-warning {{type specifier missing, defaults to 'int'}}
45*67e74705SXin Li   takeblock(^{ y = 8; });
46*67e74705SXin Li }
47*67e74705SXin Li 
48*67e74705SXin Li 
test3()49*67e74705SXin Li void (^test3())(void) {
50*67e74705SXin Li   return ^{};
51*67e74705SXin Li }
52*67e74705SXin Li 
test4()53*67e74705SXin Li void test4() {
54*67e74705SXin Li   void (^noop)(void) = ^{};
55*67e74705SXin Li   void (*noop2)() = 0;
56*67e74705SXin Li }
57*67e74705SXin Li 
58*67e74705SXin Li void myfunc(int (^block)(int)) {}
59*67e74705SXin Li 
60*67e74705SXin Li void myfunc3(const int *x);
61*67e74705SXin Li 
test5()62*67e74705SXin Li void test5() {
63*67e74705SXin Li   int a;
64*67e74705SXin Li 
65*67e74705SXin Li   myfunc(^(int abcd) {
66*67e74705SXin Li       myfunc3(&a);
67*67e74705SXin Li       return 1;
68*67e74705SXin Li     });
69*67e74705SXin Li }
70*67e74705SXin Li 
71*67e74705SXin Li void *X;
72*67e74705SXin Li 
test_arguments()73*67e74705SXin Li void test_arguments() {
74*67e74705SXin Li   int y;
75*67e74705SXin Li   int (^c)(char);
76*67e74705SXin Li   (1 ? c : 0)('x');
77*67e74705SXin Li   (1 ? 0 : c)('x');
78*67e74705SXin Li 
79*67e74705SXin Li   (1 ? c : c)('x');
80*67e74705SXin Li }
81*67e74705SXin Li 
82*67e74705SXin Li static int global_x = 10;
83*67e74705SXin Li void (^global_block)(void) = ^{ printf("global x is %d\n", global_x); };
84*67e74705SXin Li 
85*67e74705SXin Li typedef void (^void_block_t)(void);
86*67e74705SXin Li 
87*67e74705SXin Li static const void_block_t myBlock = ^{ };
88*67e74705SXin Li 
89*67e74705SXin Li static const void_block_t myBlock2 = ^ void(void) { };
90