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