blob: fbef05e53267265188970205f6df174b7ed900ab [file] [log] [blame]
Douglas Katzman3459ce22015-10-08 04:24:12 +00001// RUN: %clang_cc1 -emit-llvm -debug-info-kind=limited -triple x86_64-apple-darwin10 %s -o - | FileCheck %s
Adrian Prantl52bf3c42013-05-03 20:11:48 +00002
Adrian Prantl6815d6c2013-07-24 20:44:20 +00003// Check the line numbers for cleanup code with EH in combination with
Adrian Prantl52bf3c42013-05-03 20:11:48 +00004// simple return expressions.
5
6// CHECK: define {{.*}}foo
David Blaikie4d524432015-02-04 19:47:54 +00007// CHECK: call void @_ZN1CD1Ev(%class.C* {{.*}}), !dbg ![[RET:[0-9]+]]
8// CHECK: ret i32 0, !dbg ![[RET]]
Adrian Prantl52bf3c42013-05-03 20:11:48 +00009
Adrian Prantl524ba1f2013-07-25 00:23:42 +000010// 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
Adrian Prantl52bf3c42013-05-03 20:11:48 +000016class C {
17public:
18 ~C() {}
19 int i;
20};
21
22int foo()
23{
24 C c;
25 c.i = 42;
Adrian Prantl52bf3c42013-05-03 20:11:48 +000026 return 0;
David Blaikie4d524432015-02-04 19:47:54 +000027 // This breakpoint should be at/before the cleanup code.
Duncan P. N. Exon Smith9dd4e4e2015-04-29 16:40:08 +000028 // CHECK: ![[RET]] = !DILocation(line: [[@LINE+1]], scope: !{{.*}})
Adrian Prantl52bf3c42013-05-03 20:11:48 +000029}
Adrian Prantl524ba1f2013-07-25 00:23:42 +000030
31void bar()
32{
33 if (!foo())
Duncan P. N. Exon Smith9dd4e4e2015-04-29 16:40:08 +000034 // CHECK: {{.*}} = !DILocation(line: [[@LINE+1]], scope: !{{.*}})
Adrian Prantl524ba1f2013-07-25 00:23:42 +000035 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.
Duncan P. N. Exon Smith9dd4e4e2015-04-29 16:40:08 +000042 // CHECK: ![[RETBAR]] = !DILocation(line: [[@LINE+1]], scope: !{{.*}})
Adrian Prantl524ba1f2013-07-25 00:23:42 +000043}
44
45void baz()
46{
47 if (!foo())
Duncan P. N. Exon Smith9dd4e4e2015-04-29 16:40:08 +000048 // CHECK: ![[SCOPE1:.*]] = distinct !DILexicalBlock({{.*}}, line: [[@LINE-1]])
49 // CHECK: {{.*}} = !DILocation(line: [[@LINE+1]], scope: ![[SCOPE1]])
Adrian Prantl524ba1f2013-07-25 00:23:42 +000050 return;
51
52 if (foo()) {
53 // no cleanup
Duncan P. N. Exon Smith9dd4e4e2015-04-29 16:40:08 +000054 // CHECK: {{.*}} = !DILocation(line: [[@LINE+2]], scope: ![[SCOPE2:.*]])
55 // CHECK: ![[SCOPE2]] = distinct !DILexicalBlock({{.*}}, line: [[@LINE-3]])
Adrian Prantl524ba1f2013-07-25 00:23:42 +000056 return;
57 }
Duncan P. N. Exon Smith9dd4e4e2015-04-29 16:40:08 +000058 // CHECK: ![[RETBAZ]] = !DILocation(line: [[@LINE+1]], scope: !{{.*}})
Adrian Prantl524ba1f2013-07-25 00:23:42 +000059}