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