1*67e74705SXin Li// RUN: %clang_cc1 -E %s -o %t.mm 2*67e74705SXin Li// RUN: %clang_cc1 -x objective-c++ -fblocks -fms-extensions -rewrite-objc %t.mm -o - | FileCheck %s 3*67e74705SXin Li// RUN: %clang_cc1 -x objective-c++ -Wno-return-type -fblocks -fms-extensions -rewrite-objc -fobjc-runtime=macosx-fragile-10.5 %s -o %t-rw.cpp 4*67e74705SXin Li// RUN: %clang_cc1 -fsyntax-only -Wno-address-of-temporary -D"Class=void*" -D"id=void*" -D"SEL=void*" -D"__declspec(X)=" %t-rw.cpp 5*67e74705SXin Li// RUN: %clang_cc1 -x objective-c++ -Wno-return-type -fblocks -fms-extensions -rewrite-objc %s -o %t-modern-rw.cpp 6*67e74705SXin Li// RUN: %clang_cc1 -fsyntax-only -Wno-address-of-temporary -D"Class=void*" -D"id=void*" -D"SEL=void*" -D"__declspec(X)=" %t-modern-rw.cpp 7*67e74705SXin Li 8*67e74705SXin Li// rdar://11375908 9*67e74705SXin Litypedef unsigned long size_t; 10*67e74705SXin Li 11*67e74705SXin Li// rdar: // 11006566 12*67e74705SXin Li 13*67e74705SXin Livoid I( void (^)(void)); 14*67e74705SXin Livoid (^noop)(void); 15*67e74705SXin Li 16*67e74705SXin Livoid nothing(); 17*67e74705SXin Liint printf(const char*, ...); 18*67e74705SXin Li 19*67e74705SXin Litypedef void (^T) (void); 20*67e74705SXin Li 21*67e74705SXin Livoid takeblock(T); 22*67e74705SXin Liint takeintint(int (^C)(int)) { return C(4); } 23*67e74705SXin Li 24*67e74705SXin LiT somefunction() { 25*67e74705SXin Li if (^{ }) 26*67e74705SXin Li nothing(); 27*67e74705SXin Li 28*67e74705SXin Li noop = ^{}; 29*67e74705SXin Li 30*67e74705SXin Li noop = ^{printf("\nClosure\n"); }; 31*67e74705SXin Li 32*67e74705SXin Li I(^{ }); 33*67e74705SXin Li 34*67e74705SXin Li return ^{printf("\nClosure\n"); }; 35*67e74705SXin Li} 36*67e74705SXin Livoid test2() { 37*67e74705SXin Li int x = 4; 38*67e74705SXin Li 39*67e74705SXin Li takeblock(^{ printf("%d\n", x); }); 40*67e74705SXin Li 41*67e74705SXin Li while (1) { 42*67e74705SXin Li takeblock(^{ 43*67e74705SXin Li while(1) break; // ok 44*67e74705SXin Li }); 45*67e74705SXin Li break; 46*67e74705SXin Li } 47*67e74705SXin Li} 48*67e74705SXin Li 49*67e74705SXin Livoid test4() { 50*67e74705SXin Li void (^noop)(void) = ^{}; 51*67e74705SXin Li void (*noop2)() = 0; 52*67e74705SXin Li} 53*67e74705SXin Li 54*67e74705SXin Livoid myfunc(int (^block)(int)) {} 55*67e74705SXin Li 56*67e74705SXin Livoid myfunc3(const int *x); 57*67e74705SXin Li 58*67e74705SXin Livoid test5() { 59*67e74705SXin Li int a; 60*67e74705SXin Li 61*67e74705SXin Li myfunc(^(int abcd) { 62*67e74705SXin Li myfunc3(&a); 63*67e74705SXin Li return 1; 64*67e74705SXin Li }); 65*67e74705SXin Li} 66*67e74705SXin Li 67*67e74705SXin Livoid *X; 68*67e74705SXin Li 69*67e74705SXin Listatic int global_x = 10; 70*67e74705SXin Livoid (^global_block)(void) = ^{ printf("global x is %d\n", global_x); }; 71*67e74705SXin Li 72*67e74705SXin Li// CHECK: static __global_block_block_impl_0 __global_global_block_block_impl_0((void *)__global_block_block_func_0, &__global_block_block_desc_0_DATA); 73*67e74705SXin Li// CHECK: void (*global_block)(void) = ((void (*)())&__global_global_block_block_impl_0); 74*67e74705SXin Li 75*67e74705SXin Litypedef void (^void_block_t)(void); 76*67e74705SXin Li 77*67e74705SXin Listatic const void_block_t myBlock = ^{ }; 78*67e74705SXin Li 79*67e74705SXin Listatic const void_block_t myBlock2 = ^ void(void) { }; 80