blob: d5dd46cbe0d02c7ce210b851aa8e2a9bb473f39a [file] [log] [blame]
Adrian Prantlefb72ad2013-04-01 19:02:06 +00001// RUN: %clang_cc1 -fblocks -g -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
9void * _NSConcreteStackBlock;
10#ifdef __cplusplus
11extern "C" void exit(int);
12#else
13extern void exit(int);
14#endif
15
16enum numbers {
17 zero, one, two, three, four
18};
19
20typedef enum numbers (^myblock)(enum numbers);
21
22
23double test(myblock I) {
24 return I(three);
25}
26
27int 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}