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 LiT 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 Livoid 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 Livoid (^test3())(void) { 50*67e74705SXin Li return ^{}; 51*67e74705SXin Li } 52*67e74705SXin Li test4()53*67e74705SXin Livoid 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 Livoid 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 Livoid 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