Home | History | Annotate | Download | only in CodeGenCXX
      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:
     18   ~C() {}
     19   int i;
     20 };
     21 
     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 
     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 
     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