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 | |
23 | double test(myblock I) { |
24 | return I(three); |
25 | } |
26 | |
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 | |