blob: 4bbc251ab5d05c598f1f4ebf393be21a09de2f83 [file] [log] [blame]
Douglas Gregor60dcb842010-05-20 08:36:28 +00001// RUN: %clang_cc1 -triple x86_64-apple-darwin -verify -emit-llvm -o - %s | FileCheck %s
Anders Carlssonc8667a82009-05-19 20:40:02 +00002void t1() {
3 extern int& a;
4 int b = a;
5}
6
7void t2(int& a) {
8 int b = a;
9}
10
11int g;
12int& gr = g;
Eli Friedman50c39ea2009-05-27 06:04:58 +000013int& grr = gr;
Anders Carlssonc8667a82009-05-19 20:40:02 +000014void t3() {
15 int b = gr;
16}
Anders Carlsson4bbab922009-05-20 00:36:58 +000017
18// Test reference binding.
19
Anders Carlsson68ea78a2009-05-27 01:46:48 +000020struct C { int a; };
Anders Carlssone04d1c72009-05-20 01:03:17 +000021void f(const bool&);
Anders Carlsson4bbab922009-05-20 00:36:58 +000022void f(const int&);
23void f(const _Complex int&);
24void f(const C&);
25
Anders Carlsson48265682009-05-27 01:45:47 +000026C aggregate_return();
27
28bool& bool_reference_return();
29int& int_reference_return();
30_Complex int& complex_int_reference_return();
Anders Carlsson68ea78a2009-05-27 01:46:48 +000031C& aggregate_reference_return();
Eli Friedman5df0d422009-05-20 02:31:19 +000032
Anders Carlssone04d1c72009-05-20 01:03:17 +000033void test_bool() {
34 bool a = true;
35 f(a);
36
37 f(true);
Anders Carlsson48265682009-05-27 01:45:47 +000038
39 bool_reference_return() = true;
Anders Carlssone9f2f452009-05-27 03:37:57 +000040 a = bool_reference_return();
Anders Carlssone78ccb42010-02-03 19:13:55 +000041
42 struct { const bool& b; } b = { true };
Anders Carlssone04d1c72009-05-20 01:03:17 +000043}
44
Anders Carlsson4bbab922009-05-20 00:36:58 +000045void test_scalar() {
46 int a = 10;
Anders Carlsson4bbab922009-05-20 00:36:58 +000047 f(a);
Anders Carlssone04d1c72009-05-20 01:03:17 +000048
Anders Carlsson38d068e2009-05-20 01:24:22 +000049 struct { int bitfield : 3; } s = { 3 };
Anders Carlsson9f75e6b2009-05-20 01:27:39 +000050 f(s.bitfield);
Anders Carlsson38d068e2009-05-20 01:24:22 +000051
Anders Carlssone04d1c72009-05-20 01:03:17 +000052 f(10);
Eli Friedman5df0d422009-05-20 02:31:19 +000053
54 __attribute((vector_size(16))) typedef int vec4;
55 f((vec4){1,2,3,4}[0]);
Anders Carlsson48265682009-05-27 01:45:47 +000056
57 int_reference_return() = 10;
Anders Carlssone9f2f452009-05-27 03:37:57 +000058 a = int_reference_return();
Anders Carlssone78ccb42010-02-03 19:13:55 +000059
60 struct { const int& a; } agg = { 10 };
Anders Carlsson4bbab922009-05-20 00:36:58 +000061}
62
63void test_complex() {
64 _Complex int a = 10i;
Anders Carlsson4bbab922009-05-20 00:36:58 +000065 f(a);
Anders Carlsson7cd3a642009-05-20 01:35:03 +000066
67 f(10i);
Anders Carlsson48265682009-05-27 01:45:47 +000068
69 complex_int_reference_return() = 10i;
Anders Carlssone9f2f452009-05-27 03:37:57 +000070 a = complex_int_reference_return();
Anders Carlssone78ccb42010-02-03 19:13:55 +000071
72 struct { const _Complex int &a; } agg = { 10i };
Anders Carlsson4bbab922009-05-20 00:36:58 +000073}
74
75void test_aggregate() {
76 C c;
Anders Carlsson4bbab922009-05-20 00:36:58 +000077 f(c);
Eli Friedman5df0d422009-05-20 02:31:19 +000078
Anders Carlsson48265682009-05-27 01:45:47 +000079 f(aggregate_return());
Anders Carlsson68ea78a2009-05-27 01:46:48 +000080 aggregate_reference_return().a = 10;
Anders Carlssone70e8f72009-05-27 16:45:02 +000081
82 c = aggregate_reference_return();
Anders Carlssone78ccb42010-02-03 19:13:55 +000083
84 struct { const C& a; } agg = { C() };
Anders Carlsson4bbab922009-05-20 00:36:58 +000085}
86
Eli Friedmand54b6ac2009-05-27 04:56:12 +000087int& reference_return() {
88 return g;
89}
Eli Friedman4a187842009-05-27 05:39:06 +000090
91int reference_decl() {
92 int& a = g;
93 const int& b = 1;
94 return a+b;
95}
Anders Carlssonfaf86642009-09-01 21:18:52 +000096
97struct A {
98 int& b();
99};
100
101void f(A* a) {
102 int b = a->b();
103}
Anders Carlsson26bc2202009-10-03 16:30:22 +0000104
105// PR5122
106void *foo = 0;
107void * const & kFoo = foo;
108
Anders Carlssonb3f74422009-10-15 00:51:46 +0000109struct D : C { D(); ~D(); };
110
111void h() {
112 // CHECK: call void @_ZN1DD1Ev
113 const C& c = D();
114}
115
Anders Carlssone1b7ea12009-10-18 23:09:21 +0000116namespace T {
117 struct A {
118 A();
119 ~A();
120 };
121
122 struct B {
123 B();
124 ~B();
125 A f();
126 };
127
128 void f() {
129 // CHECK: call void @_ZN1T1BC1Ev
130 // CHECK: call void @_ZN1T1B1fEv
131 // CHECK: call void @_ZN1T1BD1Ev
132 const A& a = B().f();
133 // CHECK: call void @_ZN1T1fEv
134 f();
135 // CHECK: call void @_ZN1T1AD1Ev
136 }
137}
138
Anders Carlsson86aa0cd2009-10-19 18:28:22 +0000139// PR5227.
140namespace PR5227 {
141void f(int &a) {
142 (a = 10) = 20;
143}
144}
Sebastian Redl5d484e82009-11-23 17:18:46 +0000145
146// PR5590
147struct s0;
148struct s1 { struct s0 &s0; };
149void f0(s1 a) { s1 b = a; }
Douglas Gregor33fd1fc2010-03-24 23:14:04 +0000150
151// PR6024
152// CHECK: @_Z2f2v()
Chris Lattner35b21b82010-06-27 01:06:27 +0000153// CHECK: alloca i32,
154// CHECK-NEXT: store
155// CHECK-NEXT: ret
Douglas Gregor33fd1fc2010-03-24 23:14:04 +0000156const int &f2() { return 0; }
Chandler Carruth761c94e2010-05-16 09:32:51 +0000157
158// Don't constant fold const reference parameters with default arguments to
159// their default arguments.
160namespace N1 {
161 const int foo = 1;
162 // CHECK: @_ZN2N14test
Anders Carlsson045a6d82010-06-27 17:52:15 +0000163 void test(const int& arg = foo) {
Chandler Carruth761c94e2010-05-16 09:32:51 +0000164 // Ensure this array is on the stack where we can set values instead of
165 // being a global constant.
166 // CHECK: %args_array = alloca
167 const int* const args_array[] = { &arg };
168 }
169}
Douglas Gregor60dcb842010-05-20 08:36:28 +0000170
171// Bind to subobjects while extending the life of the complete object.
172namespace N2 {
173 class X {
174 public:
175 X(const X&);
176 X &operator=(const X&);
177 ~X();
178 };
179
180 struct P {
181 X first;
182 };
183
184 P getP();
185
186 // CHECK: define void @_ZN2N21fEi
187 // CHECK: call void @_ZN2N24getPEv
188 // CHECK: getelementptr inbounds
189 // CHECK: store i32 17
190 // CHECK: call void @_ZN2N21PD1Ev
191 void f(int i) {
192 const X& xr = getP().first;
193 i = 17;
194 }
195
196 struct SpaceWaster {
197 int i, j;
198 };
199
200 struct ReallyHasX {
201 X x;
202 };
203
204 struct HasX : ReallyHasX { };
205
206 struct HasXContainer {
207 HasX has;
208 };
209
210 struct Y : SpaceWaster, HasXContainer { };
211 struct Z : SpaceWaster, Y { };
212
213 Z getZ();
214
215 // CHECK: define void @_ZN2N21gEi
216 // CHECK: call void @_ZN2N24getZEv
Douglas Gregor2d6b0e92010-05-22 05:17:18 +0000217 // CHECK: {{getelementptr inbounds.*i32 0, i32 0}}
218 // CHECK: {{getelementptr inbounds.*i32 0, i32 0}}
219 // CHECK: store i32 19
220 // CHECK: call void @_ZN2N21ZD1Ev
221 // CHECK: ret void
Douglas Gregor60dcb842010-05-20 08:36:28 +0000222 void g(int i) {
223 const X &xr = getZ().has.x;
224 i = 19;
225 }
226}
Anders Carlsson045a6d82010-06-27 17:52:15 +0000227
228namespace N3 {
229
230// PR7326
231
232struct A {
233 explicit A(int);
234 ~A();
235};
236
237// CHECK: define internal void @__cxx_global_var_init
Chris Lattner9cbe4f02011-07-09 17:41:47 +0000238// CHECK: call void @_ZN2N31AC1Ei(%"struct.N3::A"* @_ZGRN2N35sA123E, i32 123)
Anders Carlsson045a6d82010-06-27 17:52:15 +0000239// CHECK: call i32 @__cxa_atexit
240// CHECK: ret void
241const A &sA123 = A(123);
242}
243
244namespace N4 {
245
246struct A {
247 A();
248 ~A();
249};
250
251void f() {
252 // CHECK: define void @_ZN2N41fEv
Chris Lattner9cbe4f02011-07-09 17:41:47 +0000253 // CHECK: call void @_ZN2N41AC1Ev(%"struct.N4::A"* @_ZGRZN2N41fEvE2ar)
Anders Carlsson045a6d82010-06-27 17:52:15 +0000254 // CHECK: call i32 @__cxa_atexit
255 // CHECK: ret void
256 static const A& ar = A();
257
258}
259}
260
Eli Friedman545aa7a2011-03-16 22:34:09 +0000261// PR9494
262namespace N5 {
263struct AnyS { bool b; };
264void f(const bool&);
265AnyS g();
266void h() {
267 // CHECK: call i8 @_ZN2N51gEv()
268 // CHECK: call void @_ZN2N51fERKb(i8*
269 f(g().b);
270}
271}
Douglas Gregor03e80032011-06-21 17:03:29 +0000272
273// PR9565
274namespace PR9565 {
275 struct a { int a : 10, b : 10; };
276 // CHECK: define void @_ZN6PR95651fEv()
277 void f() {
278 // CHECK: call void @llvm.memcpy
279 a x = { 0, 0 };
280 // CHECK: [[WITH_SEVENTEEN:%[a-zA-Z0-9]+]] = or i32 [[WITHOUT_SEVENTEEN:%[a-zA-Z0-9]+]], 17
281 // CHECK: store i32 [[WITH_SEVENTEEN]], i32* [[XA:%[a-zA-Z0-9]+]]
282 x.a = 17;
283 // CHECK-NEXT: bitcast
284 // CHECK-NEXT: load
285 // CHECK-NEXT: and
286 // CHECK-NEXT: shl
287 // CHECK-NEXT: ashr
288 // CHECK-NEXT: store i32
289 // CHECK-NEXT: store i32*
290 const int &y = x.a;
291 // CHECK-NEXT: bitcast
292 // CHECK-NEXT: load
293 // CHECK-NEXT: and
294 // CHECK-NEXT: or
295 // CHECK-NEXT: store i32
296 x.b = 19;
297 // CHECK-NEXT: ret void
298 }
299}