xref: /minix3/external/bsd/llvm/dist/clang/test/CodeGenCXX/debug-info-line.cpp (revision 0a6a1f1d05b60e214de2f05a7310ddd1f0e590e7)
1 // RUN: %clang_cc1 -gline-tables-only -std=c++11 -fexceptions -fcxx-exceptions -S -emit-llvm %s -o - | FileCheck %s
2 // RUN: %clang_cc1 -gline-tables-only -std=c++11 -fexceptions -fcxx-exceptions -S -emit-llvm %s -o - -triple i686-linux-gnu | FileCheck %s
3 
4 // XFAIL: win32
5 
6 int &src();
7 int *sink();
8 extern "C" __complex float complex_src();
9 extern "C" __complex float *complex_sink();
10 
11 // CHECK-LABEL: define
f1()12 void f1() {
13 #line 100
14   * // The store for the assignment should be attributed to the start of the
15       // assignment expression here, regardless of the location of subexpressions.
16       sink() = src();
17   // CHECK: store {{.*}}, !dbg [[DBG_F1:!.*]]
18 }
19 
20 struct foo {
21   int i;
22   int &j;
23   __complex float k;
24   foo();
25 };
26 
27 // CHECK-LABEL: define
foo()28 foo::foo()
29     :
30 #line 200
31       i // CHECK: store i32 {{.*}} !dbg [[DBG_FOO_VALUE:!.*]]
32       (src()),
33       j // CHECK: store i32* {{.*}} !dbg [[DBG_FOO_REF:!.*]]
34       (src()),
35       k // CHECK: store float {{.*}} !dbg [[DBG_FOO_COMPLEX:!.*]]
36       (complex_src()) {
37 }
38 
39 // CHECK-LABEL: define {{.*}}f2{{.*}}
f2()40 void f2() {
41 #line 300
42   * // CHECK: store float {{.*}} !dbg [[DBG_F2:!.*]]
43       complex_sink() = complex_src();
44 }
45 
46 // CHECK-LABEL: define
f3()47 void f3() {
48 #line 400
49   * // CHECK: store float {{.*}} !dbg [[DBG_F3:!.*]]
50       complex_sink() += complex_src();
51 }
52 
53 // CHECK-LABEL: define
f4()54 void f4() {
55 #line 500
56   auto x // CHECK: store {{.*}} !dbg [[DBG_F4:!.*]]
57       = src();
58 }
59 
60 // CHECK-LABEL: define
f5()61 void f5() {
62 #line 600
63   auto x // CHECK: store float {{.*}} !dbg [[DBG_F5:!.*]]
64       = complex_src();
65 }
66 
67 struct agg { int i; };
68 agg agg_src();
69 
70 // CHECK-LABEL: define
f6()71 void f6() {
72   agg x;
73 #line 700
74   x // CHECK: call void @llvm.memcpy{{.*}} !dbg [[DBG_F6:!.*]]
75       = agg_src();
76 }
77 
78 // CHECK-LABEL: define
f7()79 void f7() {
80   int *src1();
81   int src2();
82 #line 800
83   int x = ( // CHECK: load {{.*}} !dbg [[DBG_F7:!.*]]
84       src1())[src2()];
85 }
86 
87 // CHECK-LABEL: define
f8()88 void f8() {
89   int src1[1];
90   int src2();
91 #line 900
92   int x = ( // CHECK: load {{.*}} !dbg [[DBG_F8:!.*]]
93       src1)[src2()];
94 }
95 
96 // CHECK-LABEL: define
f9(int i)97 void f9(int i) {
98   int src1[1][i];
99   int src2();
100 #line 1000
101   auto x = ( // CHECK: getelementptr {{.*}} !dbg [[DBG_F9:!.*]]
102       src1)[src2()];
103 }
104 
105 inline void *operator new(decltype(sizeof(1)), void *p) noexcept { return p; }
106 
107 // CHECK-LABEL: define
f10()108 void f10() {
109   void *void_src();
110   ( // CHECK: icmp {{.*}} !dbg [[DBG_F10_ICMP:.*]]
111     // CHECK: store {{.*}} !dbg [[DBG_F10_STORE:!.*]]
112 #line 1100
113       new (void_src()) int(src()));
114 }
115 
116 // noexcept just to simplify the codegen a bit
117 void fn() noexcept(true);
118 
119 struct bar {
120   bar();
121   // noexcept(false) to convolute the global dtor
122   ~bar() noexcept(false);
123 };
124 // global ctor cleanup
125 // CHECK-LABEL: define
126 // CHECK: invoke{{ }}
127 // CHECK: invoke{{ }}
128 // CHECK:   to label {{.*}}, !dbg [[DBG_GLBL_CTOR_B:!.*]]
129 
130 // terminate caller
131 // CHECK-LABEL: define
132 
133 // global dtor cleanup
134 // CHECK-LABEL: define
135 // CHECK: invoke{{ }}
136 // CHECK: invoke{{ }}
137 // CHECK:   to label {{.*}}, !dbg [[DBG_GLBL_DTOR_B:!.*]]
138 #line 1500
139 bar b[1] = { //
140     (fn(),   //
141      bar())};
142 
143 // CHECK-LABEL: define
f11()144 __complex double f11() {
145   __complex double f;
146 // CHECK: store {{.*}} !dbg [[DBG_F11:!.*]]
147 #line 1200
148   return f;
149 }
150 
151 // CHECK-LABEL: define
f12()152 void f12() {
153   int f12_1();
154   void f12_2(int = f12_1());
155 // CHECK: call {{(signext )?}}i32 {{.*}} !dbg [[DBG_F12:!.*]]
156 #line 1300
157   f12_2();
158 }
159 
160 // CHECK-LABEL: define
f13()161 void f13() {
162 // CHECK: call {{.*}} !dbg [[DBG_F13:!.*]]
163 #define F13_IMPL 1, src()
164   1,
165 #line 1400
166   F13_IMPL;
167 }
168 
169 struct f14 {
170   f14(int);
171 };
172 
173 // CHECK-LABEL: define
174 struct f14_use {
175 // CHECK: call {{.*}}, !dbg [[DBG_F14_CTOR_CALL:![0-9]*]]
176 #line 1600
177   f14 v
178       =
179       1;
180   f14_use();
181 };
182 
183 f14_use::f14_use() = default;
184 
185 // CHECK-LABEL: define
186 
187 // CHECK-LABEL: define
188 int f21_a(int = 0);
189 void f21_b(int = f21_a());
f21()190 void f21() {
191 // CHECK: call {{.*}}f21_b{{.*}}, !dbg [[DBG_F21:![0-9]*]]
192 #line 2300
193   f21_b();
194 }
195 
196 // CHECK: [[DBG_F1]] = !MDLocation(line: 100,
197 // CHECK: [[DBG_FOO_VALUE]] = !MDLocation(line: 200,
198 // CHECK: [[DBG_FOO_REF]] = !MDLocation(line: 202,
199 // CHECK: [[DBG_FOO_COMPLEX]] = !MDLocation(line: 204,
200 // CHECK: [[DBG_F2]] = !MDLocation(line: 300,
201 // CHECK: [[DBG_F3]] = !MDLocation(line: 400,
202 // CHECK: [[DBG_F4]] = !MDLocation(line: 500,
203 // CHECK: [[DBG_F5]] = !MDLocation(line: 600,
204 // CHECK: [[DBG_F6]] = !MDLocation(line: 700,
205 // CHECK: [[DBG_F7]] = !MDLocation(line: 800,
206 // CHECK: [[DBG_F8]] = !MDLocation(line: 900,
207 // CHECK: [[DBG_F9]] = !MDLocation(line: 1000,
208 // CHECK: [[DBG_F10_ICMP]] = !MDLocation(line: 1100,
209 // CHECK: [[DBG_F10_STORE]] = !MDLocation(line: 1100,
210 // CHECK: [[DBG_GLBL_CTOR_B]] = !MDLocation(line: 1500,
211 // CHECK: [[DBG_GLBL_DTOR_B]] = !MDLocation(line: 1500,
212 // CHECK: [[DBG_F11]] = !MDLocation(line: 1200,
213 // CHECK: [[DBG_F12]] = !MDLocation(line: 1300,
214 // CHECK: [[DBG_F13]] = !MDLocation(line: 1400,
215