1 // RUN: %clang_cc1 -fblocks -debug-info-kind=limited -emit-llvm %s -o - | FileCheck %s 2 // Ensure that we generate a line table entry for the block cleanup. 3 // CHECK: define {{.*}} @__main_block_invoke 4 // CHECK: _NSConcreteStackBlock 5 // CHECK: = bitcast {{.*}}, !dbg ![[L1:[0-9]+]] 6 // CHECK-NOT: call {{.*}} @_Block_object_dispose{{.*}}, !dbg ![[L1]] 7 // CHECK: ret 8 9 void * _NSConcreteStackBlock; 10 #ifdef __cplusplus 11 extern "C" void exit(int); 12 #else 13 extern void exit(int); 14 #endif 15 16 enum numbers { 17 zero, one, two, three, four 18 }; 19 20 typedef enum numbers (^myblock)(enum numbers); 21 22 test(myblock I)23double test(myblock I) { 24 return I(three); 25 } 26 main()27int main() { 28 __block enum numbers x = one; 29 __block enum numbers y = two; 30 31 /* Breakpoint for first Block function. */ 32 myblock CL = ^(enum numbers z) 33 { enum numbers savex = x; 34 { __block enum numbers x = savex; 35 y = z; 36 if (y != three) 37 exit (6); 38 test ( 39 /* Breakpoint for second Block function. */ 40 ^ (enum numbers z) { 41 if (y != three) { 42 exit(1); 43 } 44 if (x != one) 45 exit(2); 46 x = z; 47 if (x != three) 48 exit(3); 49 if (y != three) 50 exit(4); 51 return (enum numbers) four; 52 });} 53 return x; 54 }; 55 56 enum numbers res = (enum numbers)test(CL); 57 58 if (res != one) 59 exit (5); 60 return 0; 61 } 62