1 // RUN: %clang_cc1 -emit-llvm -debug-info-kind=limited -triple x86_64-apple-darwin10 %s -o - | FileCheck %s
2
3 // Check the line numbers for cleanup code with EH in combination with
4 // simple return expressions.
5
6 // CHECK: define {{.*}}foo
7 // CHECK: call void @_ZN1CD1Ev(%class.C* {{.*}}), !dbg ![[RET:[0-9]+]]
8 // CHECK: ret i32 0, !dbg ![[RET]]
9
10 // CHECK: define {{.*}}bar
11 // CHECK: ret void, !dbg ![[RETBAR:[0-9]+]]
12
13 // CHECK: define {{.*}}baz
14 // CHECK: ret void, !dbg ![[RETBAZ:[0-9]+]]
15
16 class C {
17 public:
~C()18 ~C() {}
19 int i;
20 };
21
foo()22 int foo()
23 {
24 C c;
25 c.i = 42;
26 return 0;
27 // This breakpoint should be at/before the cleanup code.
28 // CHECK: ![[RET]] = !DILocation(line: [[@LINE+1]], scope: !{{.*}})
29 }
30
bar()31 void bar()
32 {
33 if (!foo())
34 // CHECK: {{.*}} = !DILocation(line: [[@LINE+1]], scope: !{{.*}})
35 return;
36
37 if (foo()) {
38 C c;
39 c.i = foo();
40 }
41 // Clang creates only a single ret instruction. Make sure it is at a useful line.
42 // CHECK: ![[RETBAR]] = !DILocation(line: [[@LINE+1]], scope: !{{.*}})
43 }
44
baz()45 void baz()
46 {
47 if (!foo())
48 // CHECK: ![[SCOPE1:.*]] = distinct !DILexicalBlock({{.*}}, line: [[@LINE-1]])
49 // CHECK: {{.*}} = !DILocation(line: [[@LINE+1]], scope: ![[SCOPE1]])
50 return;
51
52 if (foo()) {
53 // no cleanup
54 // CHECK: {{.*}} = !DILocation(line: [[@LINE+2]], scope: ![[SCOPE2:.*]])
55 // CHECK: ![[SCOPE2]] = distinct !DILexicalBlock({{.*}}, line: [[@LINE-3]])
56 return;
57 }
58 // CHECK: ![[RETBAZ]] = !DILocation(line: [[@LINE+1]], scope: !{{.*}})
59 }
60