1*67e74705SXin Li // RUN: not %clang_cc1 -triple x86_64-apple-darwin -verify -emit-llvm -o - %s | FileCheck %s
t1()2*67e74705SXin Li void t1() {
3*67e74705SXin Li // CHECK-LABEL: define void @_Z2t1v
4*67e74705SXin Li // CHECK: [[REFLOAD:%.*]] = load i32*, i32** @a, align 8
5*67e74705SXin Li // CHECK: load i32, i32* [[REFLOAD]], align 4
6*67e74705SXin Li extern int& a;
7*67e74705SXin Li int b = a;
8*67e74705SXin Li }
9*67e74705SXin Li
t2(int & a)10*67e74705SXin Li void t2(int& a) {
11*67e74705SXin Li // CHECK-LABEL: define void @_Z2t2Ri
12*67e74705SXin Li // CHECK: [[REFLOAD2:%.*]] = load i32*, i32** {{.*}}, align 8
13*67e74705SXin Li // CHECK: load i32, i32* [[REFLOAD2]], align 4
14*67e74705SXin Li int b = a;
15*67e74705SXin Li }
16*67e74705SXin Li
17*67e74705SXin Li int g;
18*67e74705SXin Li int& gr = g;
19*67e74705SXin Li int& grr = gr;
t3()20*67e74705SXin Li void t3() {
21*67e74705SXin Li int b = gr;
22*67e74705SXin Li }
23*67e74705SXin Li
24*67e74705SXin Li // Test reference binding.
25*67e74705SXin Li
26*67e74705SXin Li struct C { int a; };
27*67e74705SXin Li void f(const bool&);
28*67e74705SXin Li void f(const int&);
29*67e74705SXin Li void f(const _Complex int&);
30*67e74705SXin Li void f(const C&);
31*67e74705SXin Li
32*67e74705SXin Li C aggregate_return();
33*67e74705SXin Li
34*67e74705SXin Li bool& bool_reference_return();
35*67e74705SXin Li int& int_reference_return();
36*67e74705SXin Li _Complex int& complex_int_reference_return();
37*67e74705SXin Li C& aggregate_reference_return();
38*67e74705SXin Li
test_bool()39*67e74705SXin Li void test_bool() {
40*67e74705SXin Li bool a = true;
41*67e74705SXin Li f(a);
42*67e74705SXin Li
43*67e74705SXin Li f(true);
44*67e74705SXin Li
45*67e74705SXin Li bool_reference_return() = true;
46*67e74705SXin Li a = bool_reference_return();
47*67e74705SXin Li
48*67e74705SXin Li struct { const bool& b; } b = { true };
49*67e74705SXin Li }
50*67e74705SXin Li
test_scalar()51*67e74705SXin Li void test_scalar() {
52*67e74705SXin Li int a = 10;
53*67e74705SXin Li f(a);
54*67e74705SXin Li
55*67e74705SXin Li struct { int bitfield : 3; } s = { 3 };
56*67e74705SXin Li f(s.bitfield);
57*67e74705SXin Li
58*67e74705SXin Li f(10);
59*67e74705SXin Li
60*67e74705SXin Li __attribute((vector_size(16))) typedef int vec4;
61*67e74705SXin Li f((vec4){1,2,3,4}[0]);
62*67e74705SXin Li
63*67e74705SXin Li int_reference_return() = 10;
64*67e74705SXin Li a = int_reference_return();
65*67e74705SXin Li
66*67e74705SXin Li struct { const int& a; } agg = { 10 };
67*67e74705SXin Li }
68*67e74705SXin Li
test_complex()69*67e74705SXin Li void test_complex() {
70*67e74705SXin Li _Complex int a = 10i;
71*67e74705SXin Li f(a);
72*67e74705SXin Li
73*67e74705SXin Li f(10i);
74*67e74705SXin Li
75*67e74705SXin Li complex_int_reference_return() = 10i;
76*67e74705SXin Li a = complex_int_reference_return();
77*67e74705SXin Li
78*67e74705SXin Li struct { const _Complex int &a; } agg = { 10i };
79*67e74705SXin Li }
80*67e74705SXin Li
test_aggregate()81*67e74705SXin Li void test_aggregate() {
82*67e74705SXin Li C c;
83*67e74705SXin Li f(c);
84*67e74705SXin Li
85*67e74705SXin Li f(aggregate_return());
86*67e74705SXin Li aggregate_reference_return().a = 10;
87*67e74705SXin Li
88*67e74705SXin Li c = aggregate_reference_return();
89*67e74705SXin Li
90*67e74705SXin Li struct { const C& a; } agg = { C() };
91*67e74705SXin Li }
92*67e74705SXin Li
reference_return()93*67e74705SXin Li int& reference_return() {
94*67e74705SXin Li return g;
95*67e74705SXin Li }
96*67e74705SXin Li
reference_decl()97*67e74705SXin Li int reference_decl() {
98*67e74705SXin Li int& a = g;
99*67e74705SXin Li const int& b = 1;
100*67e74705SXin Li return a+b;
101*67e74705SXin Li }
102*67e74705SXin Li
103*67e74705SXin Li struct A {
104*67e74705SXin Li int& b();
105*67e74705SXin Li };
106*67e74705SXin Li
f(A * a)107*67e74705SXin Li void f(A* a) {
108*67e74705SXin Li int b = a->b();
109*67e74705SXin Li }
110*67e74705SXin Li
111*67e74705SXin Li // PR5122
112*67e74705SXin Li void *foo = 0;
113*67e74705SXin Li void * const & kFoo = foo;
114*67e74705SXin Li
115*67e74705SXin Li struct D : C { D(); ~D(); };
116*67e74705SXin Li
h()117*67e74705SXin Li void h() {
118*67e74705SXin Li // CHECK: call void @_ZN1DD1Ev
119*67e74705SXin Li const C& c = D();
120*67e74705SXin Li }
121*67e74705SXin Li
122*67e74705SXin Li namespace T {
123*67e74705SXin Li struct A {
124*67e74705SXin Li A();
125*67e74705SXin Li ~A();
126*67e74705SXin Li };
127*67e74705SXin Li
128*67e74705SXin Li struct B {
129*67e74705SXin Li B();
130*67e74705SXin Li ~B();
131*67e74705SXin Li A f();
132*67e74705SXin Li };
133*67e74705SXin Li
f()134*67e74705SXin Li void f() {
135*67e74705SXin Li // CHECK: call void @_ZN1T1BC1Ev
136*67e74705SXin Li // CHECK: call void @_ZN1T1B1fEv
137*67e74705SXin Li // CHECK: call void @_ZN1T1BD1Ev
138*67e74705SXin Li const A& a = B().f();
139*67e74705SXin Li // CHECK: call void @_ZN1T1fEv
140*67e74705SXin Li f();
141*67e74705SXin Li // CHECK: call void @_ZN1T1AD1Ev
142*67e74705SXin Li }
143*67e74705SXin Li }
144*67e74705SXin Li
145*67e74705SXin Li // PR5227.
146*67e74705SXin Li namespace PR5227 {
f(int & a)147*67e74705SXin Li void f(int &a) {
148*67e74705SXin Li (a = 10) = 20;
149*67e74705SXin Li }
150*67e74705SXin Li }
151*67e74705SXin Li
152*67e74705SXin Li // PR5590
153*67e74705SXin Li struct s0;
154*67e74705SXin Li struct s1 { struct s0 &s0; };
f0(s1 a)155*67e74705SXin Li void f0(s1 a) { s1 b = a; }
156*67e74705SXin Li
157*67e74705SXin Li // PR6024
158*67e74705SXin Li // CHECK: @_Z2f2v()
159*67e74705SXin Li // CHECK: alloca i32,
160*67e74705SXin Li // CHECK-NEXT: store
161*67e74705SXin Li // CHECK-NEXT: ret
f2()162*67e74705SXin Li const int &f2() { return 0; }
163*67e74705SXin Li
164*67e74705SXin Li // Don't constant fold const reference parameters with default arguments to
165*67e74705SXin Li // their default arguments.
166*67e74705SXin Li namespace N1 {
167*67e74705SXin Li const int foo = 1;
168*67e74705SXin Li // CHECK: @_ZN2N14test
test(const int & arg=foo)169*67e74705SXin Li void test(const int& arg = foo) {
170*67e74705SXin Li // Ensure this array is on the stack where we can set values instead of
171*67e74705SXin Li // being a global constant.
172*67e74705SXin Li // CHECK: %args_array = alloca
173*67e74705SXin Li const int* const args_array[] = { &arg };
174*67e74705SXin Li }
175*67e74705SXin Li }
176*67e74705SXin Li
177*67e74705SXin Li // Bind to subobjects while extending the life of the complete object.
178*67e74705SXin Li namespace N2 {
179*67e74705SXin Li class X {
180*67e74705SXin Li public:
181*67e74705SXin Li X(const X&);
182*67e74705SXin Li X &operator=(const X&);
183*67e74705SXin Li ~X();
184*67e74705SXin Li };
185*67e74705SXin Li
186*67e74705SXin Li struct P {
187*67e74705SXin Li X first;
188*67e74705SXin Li };
189*67e74705SXin Li
190*67e74705SXin Li P getP();
191*67e74705SXin Li
192*67e74705SXin Li // CHECK-LABEL: define void @_ZN2N21fEi
193*67e74705SXin Li // CHECK: call void @_ZN2N24getPEv
194*67e74705SXin Li // CHECK: getelementptr inbounds
195*67e74705SXin Li // CHECK: store i32 17
196*67e74705SXin Li // CHECK: call void @_ZN2N21PD1Ev
f(int i)197*67e74705SXin Li void f(int i) {
198*67e74705SXin Li const X& xr = getP().first;
199*67e74705SXin Li i = 17;
200*67e74705SXin Li }
201*67e74705SXin Li
202*67e74705SXin Li struct SpaceWaster {
203*67e74705SXin Li int i, j;
204*67e74705SXin Li };
205*67e74705SXin Li
206*67e74705SXin Li struct ReallyHasX {
207*67e74705SXin Li X x;
208*67e74705SXin Li };
209*67e74705SXin Li
210*67e74705SXin Li struct HasX : ReallyHasX { };
211*67e74705SXin Li
212*67e74705SXin Li struct HasXContainer {
213*67e74705SXin Li HasX has;
214*67e74705SXin Li };
215*67e74705SXin Li
216*67e74705SXin Li struct Y : SpaceWaster, HasXContainer { };
217*67e74705SXin Li struct Z : SpaceWaster, Y { };
218*67e74705SXin Li
219*67e74705SXin Li Z getZ();
220*67e74705SXin Li
221*67e74705SXin Li // CHECK-LABEL: define void @_ZN2N21gEi
222*67e74705SXin Li // CHECK: call void @_ZN2N24getZEv
223*67e74705SXin Li // CHECK: {{getelementptr inbounds.*i32 0, i32 0}}
224*67e74705SXin Li // CHECK: {{getelementptr inbounds.*i32 0, i32 0}}
225*67e74705SXin Li // CHECK: store i32 19
226*67e74705SXin Li // CHECK: call void @_ZN2N21ZD1Ev
227*67e74705SXin Li // CHECK: ret void
g(int i)228*67e74705SXin Li void g(int i) {
229*67e74705SXin Li const X &xr = getZ().has.x;
230*67e74705SXin Li i = 19;
231*67e74705SXin Li }
232*67e74705SXin Li }
233*67e74705SXin Li
234*67e74705SXin Li namespace N3 {
235*67e74705SXin Li
236*67e74705SXin Li // PR7326
237*67e74705SXin Li
238*67e74705SXin Li struct A {
239*67e74705SXin Li explicit A(int);
240*67e74705SXin Li ~A();
241*67e74705SXin Li };
242*67e74705SXin Li
243*67e74705SXin Li // CHECK-LABEL: define internal void @__cxx_global_var_init
244*67e74705SXin Li // CHECK: call void @_ZN2N31AC1Ei(%"struct.N3::A"* @_ZGRN2N35sA123E_, i32 123)
245*67e74705SXin Li // CHECK: call i32 @__cxa_atexit
246*67e74705SXin Li // CHECK: ret void
247*67e74705SXin Li const A &sA123 = A(123);
248*67e74705SXin Li }
249*67e74705SXin Li
250*67e74705SXin Li namespace N4 {
251*67e74705SXin Li
252*67e74705SXin Li struct A {
253*67e74705SXin Li A();
254*67e74705SXin Li ~A();
255*67e74705SXin Li };
256*67e74705SXin Li
f()257*67e74705SXin Li void f() {
258*67e74705SXin Li // CHECK-LABEL: define void @_ZN2N41fEv
259*67e74705SXin Li // CHECK: call void @_ZN2N41AC1Ev(%"struct.N4::A"* @_ZGRZN2N41fEvE2ar_)
260*67e74705SXin Li // CHECK: call i32 @__cxa_atexit
261*67e74705SXin Li // CHECK: ret void
262*67e74705SXin Li static const A& ar = A();
263*67e74705SXin Li
264*67e74705SXin Li }
265*67e74705SXin Li }
266*67e74705SXin Li
267*67e74705SXin Li // PR9494
268*67e74705SXin Li namespace N5 {
269*67e74705SXin Li struct AnyS { bool b; };
270*67e74705SXin Li void f(const bool&);
271*67e74705SXin Li AnyS g();
h()272*67e74705SXin Li void h() {
273*67e74705SXin Li // CHECK: call i8 @_ZN2N51gEv()
274*67e74705SXin Li // CHECK: call void @_ZN2N51fERKb(i8*
275*67e74705SXin Li f(g().b);
276*67e74705SXin Li }
277*67e74705SXin Li }
278*67e74705SXin Li
279*67e74705SXin Li // PR9565
280*67e74705SXin Li namespace PR9565 {
281*67e74705SXin Li struct a { int a : 10, b : 10; };
282*67e74705SXin Li // CHECK-LABEL: define void @_ZN6PR95651fEv()
f()283*67e74705SXin Li void f() {
284*67e74705SXin Li // CHECK: call void @llvm.memcpy
285*67e74705SXin Li a x = { 0, 0 };
286*67e74705SXin Li // CHECK: [[WITH_SEVENTEEN:%[.a-zA-Z0-9]+]] = or i32 [[WITHOUT_SEVENTEEN:%[.a-zA-Z0-9]+]], 17
287*67e74705SXin Li // CHECK: store i32 [[WITH_SEVENTEEN]], i32* [[XA:%[.a-zA-Z0-9]+]]
288*67e74705SXin Li x.a = 17;
289*67e74705SXin Li // CHECK-NEXT: bitcast
290*67e74705SXin Li // CHECK-NEXT: load
291*67e74705SXin Li // CHECK-NEXT: shl
292*67e74705SXin Li // CHECK-NEXT: ashr
293*67e74705SXin Li // CHECK-NEXT: store i32
294*67e74705SXin Li // CHECK-NEXT: store i32*
295*67e74705SXin Li const int &y = x.a;
296*67e74705SXin Li // CHECK-NEXT: bitcast
297*67e74705SXin Li // CHECK-NEXT: load
298*67e74705SXin Li // CHECK-NEXT: and
299*67e74705SXin Li // CHECK-NEXT: or i32 {{.*}}, 19456
300*67e74705SXin Li // CHECK-NEXT: store i32
301*67e74705SXin Li x.b = 19;
302*67e74705SXin Li // CHECK-NEXT: ret void
303*67e74705SXin Li }
304*67e74705SXin Li }
305*67e74705SXin Li
306*67e74705SXin Li namespace N6 {
307*67e74705SXin Li extern struct x {char& x;}y;
a()308*67e74705SXin Li int a() { return y.x; }
309*67e74705SXin Li // CHECK-LABEL: define i32 @_ZN2N61aEv
310*67e74705SXin Li // CHECK: [[REFLOAD3:%.*]] = load i8*, i8** getelementptr inbounds (%"struct.N6::x", %"struct.N6::x"* @_ZN2N61yE, i32 0, i32 0), align 8
311*67e74705SXin Li // CHECK: load i8, i8* [[REFLOAD3]], align 1
312*67e74705SXin Li }
313