block-literal.c revision 04831aa3271edc5f00a651bf7152c2902981d7c3
1// RUN: clang -fsyntax-only %s -verify -fblocks 2 3void I( void (^)(void)); 4void (^noop)(void); 5 6void nothing(); 7int printf(const char*, ...); 8 9typedef void (^T) (void); 10 11void takeclosure(T); 12int takeintint(int (^C)(int)) { return C(4); } 13 14T somefunction() { 15 if (^{ }) 16 nothing(); 17 18 noop = ^{}; 19 20 noop = ^{printf("\nClosure\n"); }; 21 22 I(^{ }); 23 24 return ^{printf("\nClosure\n"); }; // expected-error {{returning block that lives on the local stack}} 25} 26void test2() { 27 int x = 4; 28 29 takeclosure(^{ printf("%d\n", x); }); 30 31 while (1) { 32 takeclosure(^{ 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 {{goto not allowed}} 37 }); 38 break; 39 } 40 41foo: 42 takeclosure(^{ x = 4; }); // expected-error {{variable is not assignable (missing __block type specifier)}} 43 __block y = 7; // expected-warning {{type specifier missing, defaults to 'int'}} 44 takeclosure(^{ y = 8; }); 45} 46 47 48void (^test3())(void) { 49 return ^{}; // expected-error {{returning block that lives on the local stack}} 50} 51 52void test4() { 53 void (^noop)(void) = ^{}; 54 void (*noop2)() = 0; 55} 56 57void myfunc(int (^block)(int)) {} 58 59void myfunc3(const int *x); 60 61void test5() { 62 int a; 63 64 myfunc(^(int abcd) { 65 myfunc3(&a); 66 return 1; 67 }); 68} 69 70void *X; 71 72void test_arguments() { 73 int y; 74 int (^c)(char); 75 (1 ? c : 0)('x'); 76 (1 ? 0 : c)('x'); 77 78 (1 ? c : c)('x'); 79} 80 81static int global_x = 10; 82void (^global_block)(void) = ^{ printf("global x is %d\n", global_x); }; 83 84#if 0 85// Old syntax. FIXME: convert/test. 86void test_byref() { 87 int i; 88 89 X = ^{| g |}; // error {{use of undeclared identifier 'g'}} 90 91 X = ^{| i,i,i | }; 92 93 X = ^{|i| i = 0; }; 94 95} 96 97// TODO: global closures someday. 98void *A = ^{}; 99void *B = ^(int){ A = 0; }; 100 101 102// Closures can not take return types at this point. 103void test_retvals() { 104 // Explicit return value. 105 ^int{}; // error {{closure with explicit return type requires argument list}} 106 X = ^void(){}; 107 108 // Optional specification of return type. 109 X = ^char{ return 'x'; }; // error {{closure with explicit return type requires argument list}} 110 111 X = ^/*missing declspec*/ *() { return (void*)0; }; 112 X = ^void*() { return (void*)0; }; 113 114 //X = ^char(short c){ if (c) return c; else return (int)4; }; 115 116} 117 118#endif 119