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