90 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			90 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			C
		
	
	
	
| // RUN: %clang_cc1 -fsyntax-only %s -verify -fblocks
 | |
| 
 | |
| void I( void (^)(void));
 | |
| void (^noop)(void);
 | |
| 
 | |
| void nothing();
 | |
| int printf(const char*, ...);
 | |
| 
 | |
| typedef void (^T) (void);
 | |
| 
 | |
| void takeblock(T);
 | |
| int takeintint(int (^C)(int)) { return C(4); }
 | |
| 
 | |
| T somefunction() {
 | |
|   if (^{ })
 | |
|     nothing();
 | |
| 
 | |
|   noop = ^{};
 | |
| 
 | |
|   noop = ^{printf("\nClosure\n"); };
 | |
| 
 | |
|   I(^{ });
 | |
| 
 | |
|   return ^{printf("\nClosure\n"); };
 | |
| }
 | |
| void test2() {
 | |
|   int x = 4;
 | |
| 
 | |
|   takeblock(^{ printf("%d\n", x); });
 | |
| 
 | |
|   while (1) {
 | |
|     takeblock(^{ 
 | |
|         break;  // expected-error {{'break' statement not in loop or switch statement}}
 | |
|         continue; // expected-error {{'continue' statement not in loop statement}}
 | |
|         while(1) break;  // ok
 | |
|         goto foo; // expected-error {{use of undeclared label 'foo'}}
 | |
|         a: goto a;       // ok
 | |
|       });
 | |
|     break;
 | |
|   }
 | |
| 
 | |
|   foo:
 | |
|   takeblock(^{ x = 4; });  // expected-error {{variable is not assignable (missing __block type specifier)}}
 | |
|   __block y = 7;    // expected-warning {{type specifier missing, defaults to 'int'}}
 | |
|   takeblock(^{ y = 8; });
 | |
| }
 | |
| 
 | |
| 
 | |
| void (^test3())(void) { 
 | |
|   return ^{};
 | |
| }
 | |
| 
 | |
| void test4() {
 | |
|   void (^noop)(void) = ^{};
 | |
|   void (*noop2)() = 0;
 | |
| }
 | |
| 
 | |
| void myfunc(int (^block)(int)) {}
 | |
| 
 | |
| void myfunc3(const int *x);
 | |
| 
 | |
| void test5() {
 | |
|   int a;
 | |
| 
 | |
|   myfunc(^(int abcd) {
 | |
|       myfunc3(&a);
 | |
|       return 1;
 | |
|     });
 | |
| }
 | |
| 
 | |
| void *X;
 | |
| 
 | |
| void test_arguments() {
 | |
|   int y;
 | |
|   int (^c)(char);
 | |
|   (1 ? c : 0)('x');
 | |
|   (1 ? 0 : c)('x');
 | |
| 
 | |
|   (1 ? c : c)('x');
 | |
| }
 | |
| 
 | |
| static int global_x = 10;
 | |
| void (^global_block)(void) = ^{ printf("global x is %d\n", global_x); };
 | |
| 
 | |
| typedef void (^void_block_t)(void);
 | |
| 
 | |
| static const void_block_t myBlock = ^{ };
 | |
| 
 | |
| static const void_block_t myBlock2 = ^ void(void) { }; 
 |