|  | // RUN: %clang_cc1 -fblocks -debug-info-kind=limited -emit-llvm %s -o - | FileCheck %s | 
|  | // Ensure that we generate a line table entry for the block cleanup. | 
|  | // CHECK: define {{.*}} @__main_block_invoke | 
|  | // CHECK: _NSConcreteStackBlock | 
|  | // CHECK: = bitcast {{.*}}, !dbg ![[L1:[0-9]+]] | 
|  | // CHECK-NOT:  call {{.*}} @_Block_object_dispose{{.*}}, !dbg ![[L1]] | 
|  | // CHECK: ret | 
|  |  | 
|  | void * _NSConcreteStackBlock; | 
|  | #ifdef __cplusplus | 
|  | extern "C" void exit(int); | 
|  | #else | 
|  | extern void exit(int); | 
|  | #endif | 
|  |  | 
|  | enum numbers { | 
|  | zero, one, two, three, four | 
|  | }; | 
|  |  | 
|  | typedef enum numbers (^myblock)(enum numbers); | 
|  |  | 
|  |  | 
|  | double test(myblock I) { | 
|  | return I(three); | 
|  | } | 
|  |  | 
|  | int main() { | 
|  | __block enum numbers x = one; | 
|  | __block enum numbers y = two; | 
|  |  | 
|  | /* Breakpoint for first Block function.  */ | 
|  | myblock CL = ^(enum numbers z) | 
|  | { enum numbers savex = x; | 
|  | { __block enum numbers x = savex; | 
|  | y = z; | 
|  | if (y != three) | 
|  | exit (6); | 
|  | test ( | 
|  | /* Breakpoint for second Block function.  */ | 
|  | ^ (enum numbers z) { | 
|  | if (y != three) { | 
|  | exit(1); | 
|  | } | 
|  | if (x != one) | 
|  | exit(2); | 
|  | x = z; | 
|  | if (x != three) | 
|  | exit(3); | 
|  | if (y != three) | 
|  | exit(4); | 
|  | return (enum numbers) four; | 
|  | });} | 
|  | return x; | 
|  | }; | 
|  |  | 
|  | enum numbers res = (enum numbers)test(CL); | 
|  |  | 
|  | if (res != one) | 
|  | exit (5); | 
|  | return 0; | 
|  | } |