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