62 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			62 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			C++
		
	
	
	
| // RUN: %clang_cc1 -fblocks -g -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;
 | |
| }
 |