1// RUN: %clang_cc1 -w -gline-tables-only -std=c++11 -fexceptions -fcxx-exceptions -S -emit-llvm %s -o - | FileCheck %s
2// RUN: %clang_cc1 -w -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
6int &src();
7int *sink();
8extern "C" __complex float complex_src();
9extern "C" __complex float *complex_sink();
10
11// CHECK-LABEL: define
12void f1() {
13  *sink()
14  // CHECK: store {{.*}}, !dbg [[DBG_F1:!.*]]
15#line 100
16      = //
17      src();
18}
19
20struct foo {
21  int i;
22  int &j;
23  __complex float k;
24  foo();
25};
26
27// CHECK-LABEL: define
28foo::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{{.*}}
40void f2() {
41  // CHECK: store float {{.*}} !dbg [[DBG_F2:!.*]]
42  *complex_sink()
43#line 300
44      = //
45      complex_src();
46}
47
48// CHECK-LABEL: define
49void f3() {
50  // CHECK: store float {{.*}} !dbg [[DBG_F3:!.*]]
51  *complex_sink()
52#line 400
53      += //
54      complex_src();
55}
56
57// CHECK-LABEL: define
58void f4() {
59#line 500
60  auto x // CHECK: store {{.*}} !dbg [[DBG_F4:!.*]]
61      = src();
62}
63
64// CHECK-LABEL: define
65void f5() {
66#line 600
67  auto x // CHECK: store float {{.*}} !dbg [[DBG_F5:!.*]]
68      = complex_src();
69}
70
71struct agg { int i; };
72agg agg_src();
73
74// CHECK-LABEL: define
75void f6() {
76  agg x;
77  // CHECK: call void @llvm.memcpy{{.*}} !dbg [[DBG_F6:!.*]]
78  x
79#line 700
80      = //
81      agg_src();
82}
83
84// CHECK-LABEL: define
85void f7() {
86  int *src1();
87  int src2();
88#line 800
89  int x = ( // CHECK: load {{.*}} !dbg [[DBG_F7:!.*]]
90      src1())[src2()];
91}
92
93// CHECK-LABEL: define
94void f8() {
95  int src1[1];
96  int src2();
97#line 900
98  int x = ( // CHECK: load {{.*}} !dbg [[DBG_F8:!.*]]
99      src1)[src2()];
100}
101
102// CHECK-LABEL: define
103void f9(int i) {
104  int src1[1][i];
105  int src2();
106#line 1000
107  auto x = ( // CHECK: getelementptr {{.*}} !dbg [[DBG_F9:!.*]]
108      src1)[src2()];
109}
110
111inline void *operator new(decltype(sizeof(1)), void *p) noexcept { return p; }
112
113// CHECK-LABEL: define
114void f10() {
115  void *void_src();
116  (
117    // CHECK: store {{.*}} !dbg [[DBG_F10_STORE:!.*]]
118#line 1100
119      new (void_src()) int(src()));
120}
121
122// noexcept just to simplify the codegen a bit
123void fn() noexcept(true);
124
125struct bar {
126  bar();
127  // noexcept(false) to convolute the global dtor
128  ~bar() noexcept(false);
129};
130// global ctor cleanup
131// CHECK-LABEL: define
132// CHECK: invoke{{ }}
133// CHECK: invoke{{ }}
134// CHECK:   to label {{.*}}, !dbg [[DBG_GLBL_CTOR_B:!.*]]
135
136// terminate caller
137// CHECK-LABEL: define
138
139// global dtor cleanup
140// CHECK-LABEL: define
141// CHECK: invoke{{ }}
142// CHECK: invoke{{ }}
143// CHECK:   to label {{.*}}, !dbg [[DBG_GLBL_DTOR_B:!.*]]
144#line 1200
145bar b[1] = { //
146    (fn(),   //
147     bar())};
148
149// CHECK-LABEL: define
150__complex double f11() {
151  __complex double f;
152// CHECK: store {{.*}} !dbg [[DBG_F11:!.*]]
153#line 1300
154  return f;
155}
156
157// CHECK-LABEL: define
158void f12() {
159  int f12_1();
160  void f12_2(int = f12_1());
161// CHECK: call {{(signext )?}}i32 {{.*}} !dbg [[DBG_F12:!.*]]
162#line 1400
163  f12_2();
164}
165
166// CHECK-LABEL: define
167void f13() {
168// CHECK: call {{.*}} !dbg [[DBG_F13:!.*]]
169#define F13_IMPL 1, src()
170  1,
171#line 1500
172  F13_IMPL;
173}
174
175struct f14_impl {
176  f14_impl(int);
177};
178
179// CHECK-LABEL: define
180struct f14_use {
181// CHECK: call {{.*}}f14_impl{{.*}}, !dbg [[DBG_F14_CTOR_CALL:![0-9]*]]
182#line 1600
183  f14_impl v{//
184             1};
185  f14_use();
186};
187
188f14_use::f14_use() = default;
189
190// CHECK-LABEL: define
191// CHECK-LABEL: define
192void func(foo);
193void f15(foo *f) {
194  func(
195// CHECK: getelementptr {{.*}}, !dbg [[DBG_F15:![0-9]*]]
196#line 1700
197      f[3]);
198}
199
200// CHECK-LABEL: define
201void f16(__complex float f) {
202  __complex float g = //
203// CHECK: add {{.*}}, !dbg [[DBG_F16:![0-9]*]]
204#line 1800
205      f + 1;
206}
207
208// CHECK-LABEL: define
209void f17(int *x) {
210  1,
211// CHECK: getelementptr {{.*}}, !dbg [[DBG_F17:![0-9]*]]
212#line 1900
213      x[1];
214}
215
216// CHECK-LABEL: define
217void f18(int a, int b) {
218// CHECK: icmp {{.*}}, !dbg [[DBG_F18_1:![0-9]*]]
219// CHECK: br {{.*}}, !dbg [[DBG_F18_2:![0-9]*]]
220#line 2000
221  if (a  //
222      && //
223      b)
224    ;
225}
226
227// CHECK-LABEL: define
228void f19(int a, int b) {
229// CHECK: icmp {{.*}}, !dbg [[DBG_F19_1:![0-9]*]]
230// CHECK: br {{.*}}, !dbg [[DBG_F19_2:![0-9]*]]
231#line 2100
232  if (a  //
233      || //
234      b)
235    ;
236}
237
238// CHECK-LABEL: define
239void f20(int a, int b, int c) {
240// CHECK: icmp {{.*}}, !dbg [[DBG_F20_1:![0-9]*]]
241// FIXME: Conditional operator's exprloc should be the '?' not the start of the
242// expression, then this would go in the right place. (but adding getExprLoc to
243// the ConditionalOperator breaks the ARC migration tool - need to investigate
244// further).
245// CHECK: br {{.*}}, !dbg [[DBG_F20_1]]
246#line 2200
247  if (a  //
248      ? //
249      b : c)
250    ;
251}
252
253// CHECK-LABEL: define
254int f21_a(int = 0);
255void f21_b(int = f21_a());
256void f21() {
257// CHECK: call {{.*}}f21_b{{.*}}, !dbg [[DBG_F21:![0-9]*]]
258#line 2300
259  f21_b();
260}
261
262// CHECK-LABEL: define
263struct f22_dtor {
264  ~f22_dtor();
265};
266void f22() {
267  {
268    f22_dtor f;
269    src();
270// CHECK: invoke {{.*}}src
271// CHECK: call {{.*}}, !dbg [[DBG_F22:![0-9]*]]
272// CHECK: call {{.*}}, !dbg [[DBG_F22]]
273#line 2400
274  }
275}
276
277// CHECK-LABEL: define
278struct f23_struct {
279};
280f23_struct f23_a();
281void f23_b(f23_struct = f23_a());
282void f23() {
283// CHECK: call {{.*}}f23_a{{.*}}, !dbg [[DBG_F23:![0-9]*]]
284#line 2500
285  f23_b();
286}
287
288// CHECK-LABEL: define
289void f24_a(__complex float = complex_src());
290void f24() {
291// CHECK: call {{.*}}complex_src{{.*}}, !dbg [[DBG_F24:![0-9]*]]
292#line 2600
293  f24_a();
294}
295
296// CHECK: [[DBG_F1]] = !MDLocation(line: 100,
297// CHECK: [[DBG_FOO_VALUE]] = !MDLocation(line: 200,
298// CHECK: [[DBG_FOO_REF]] = !MDLocation(line: 202,
299// CHECK: [[DBG_FOO_COMPLEX]] = !MDLocation(line: 204,
300// CHECK: [[DBG_F2]] = !MDLocation(line: 300,
301// CHECK: [[DBG_F3]] = !MDLocation(line: 400,
302// CHECK: [[DBG_F4]] = !MDLocation(line: 500,
303// CHECK: [[DBG_F5]] = !MDLocation(line: 600,
304// CHECK: [[DBG_F6]] = !MDLocation(line: 700,
305// CHECK: [[DBG_F7]] = !MDLocation(line: 800,
306// CHECK: [[DBG_F8]] = !MDLocation(line: 900,
307// CHECK: [[DBG_F9]] = !MDLocation(line: 1000,
308// CHECK: [[DBG_F10_STORE]] = !MDLocation(line: 1100,
309// CHECK: [[DBG_GLBL_CTOR_B]] = !MDLocation(line: 1200,
310// CHECK: [[DBG_GLBL_DTOR_B]] = !MDLocation(line: 1200,
311// CHECK: [[DBG_F11]] = !MDLocation(line: 1300,
312// CHECK: [[DBG_F12]] = !MDLocation(line: 1400,
313// CHECK: [[DBG_F13]] = !MDLocation(line: 1500,
314// CHECK: [[DBG_F14_CTOR_CALL]] = !MDLocation(line: 1600,
315// CHECK: [[DBG_F15]] = !MDLocation(line: 1700,
316// CHECK: [[DBG_F16]] = !MDLocation(line: 1800,
317// CHECK: [[DBG_F17]] = !MDLocation(line: 1900,
318// CHECK: [[DBG_F18_1]] = !MDLocation(line: 2000,
319// CHECK: [[DBG_F18_2]] = !MDLocation(line: 2001,
320// CHECK: [[DBG_F19_1]] = !MDLocation(line: 2100,
321// CHECK: [[DBG_F19_2]] = !MDLocation(line: 2101,
322// CHECK: [[DBG_F20_1]] = !MDLocation(line: 2200,
323// CHECK: [[DBG_F23]] = !MDLocation(line: 2500,
324// CHECK: [[DBG_F24]] = !MDLocation(line: 2600,
325