• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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)23 double test(myblock I) {
24   return I(three);
25 }
26 
main()27 int 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