Clang Project

clang_source_code/test/CodeGenCXX/cp-blocks-linetables.cpp
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
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}
62