1 // RUN: %clang_cc1 -triple i386-unknown-unknown %s -emit-llvm -o %t -fblocks 2 void (^f)(void) = ^{}; 3 4 // rdar://6768379 5 int f0(int (^a0)()) { 6 return a0(1, 2, 3); 7 } 8 9 // Verify that attributes on blocks are set correctly. 10 typedef struct s0 T; 11 struct s0 { 12 int a[64]; 13 }; 14 15 // RUN: grep 'internal void @__f2_block_invoke_0(.struct.s0\* sret .*, .*, .* byval .*)' %t 16 struct s0 f2(struct s0 a0) { 17 return ^(struct s0 a1){ return a1; }(a0); 18 } 19 20 // This should not crash: rdar://6808051 21 void *P = ^{ 22 void *Q = __func__; 23 }; 24 25 void (^test1)(void) = ^(void) { 26 __block int i; 27 ^ { i = 1; }(); 28 }; 29 30 typedef double ftype(double); 31 // It's not clear that we *should* support this syntax, but until that decision 32 // is made, we should support it properly and not crash. 33 ftype ^test2 = ^ftype { 34 return 0; 35 }; 36 37 // rdar://problem/8605032 38 void f3_helper(void (^)(void)); 39 void f3() { 40 _Bool b = 0; 41 f3_helper(^{ if (b) {} }); 42 } 43