blob: 180e0cfa0055333d671ab311cda8dac4573127a0 [file] [log] [blame]
Rafael Espindola96e78132013-07-04 16:16:58 +00001// RUN: not %clang_cc1 -triple x86_64-apple-darwin -verify -emit-llvm -o - %s | FileCheck %s
Anders Carlssonc8667a82009-05-19 20:40:02 +00002void t1() {
Stephen Lin93ab6bf2013-08-15 06:47:53 +00003 // CHECK-LABEL: define void @_Z2t1v
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07004 // CHECK: [[REFLOAD:%.*]] = load i32*, i32** @a, align 8
5 // CHECK: load i32, i32* [[REFLOAD]], align 4
Anders Carlssonc8667a82009-05-19 20:40:02 +00006 extern int& a;
7 int b = a;
8}
9
10void t2(int& a) {
Stephen Lin93ab6bf2013-08-15 06:47:53 +000011 // CHECK-LABEL: define void @_Z2t2Ri
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -070012 // CHECK: [[REFLOAD2:%.*]] = load i32*, i32** {{.*}}, align 8
13 // CHECK: load i32, i32* [[REFLOAD2]], align 4
Anders Carlssonc8667a82009-05-19 20:40:02 +000014 int b = a;
15}
16
17int g;
18int& gr = g;
Eli Friedman50c39ea2009-05-27 06:04:58 +000019int& grr = gr;
Anders Carlssonc8667a82009-05-19 20:40:02 +000020void t3() {
21 int b = gr;
22}
Anders Carlsson4bbab922009-05-20 00:36:58 +000023
24// Test reference binding.
25
Anders Carlsson68ea78a2009-05-27 01:46:48 +000026struct C { int a; };
Anders Carlssone04d1c72009-05-20 01:03:17 +000027void f(const bool&);
Anders Carlsson4bbab922009-05-20 00:36:58 +000028void f(const int&);
29void f(const _Complex int&);
30void f(const C&);
31
Anders Carlsson48265682009-05-27 01:45:47 +000032C aggregate_return();
33
34bool& bool_reference_return();
35int& int_reference_return();
36_Complex int& complex_int_reference_return();
Anders Carlsson68ea78a2009-05-27 01:46:48 +000037C& aggregate_reference_return();
Eli Friedman5df0d422009-05-20 02:31:19 +000038
Anders Carlssone04d1c72009-05-20 01:03:17 +000039void test_bool() {
40 bool a = true;
41 f(a);
42
43 f(true);
Anders Carlsson48265682009-05-27 01:45:47 +000044
45 bool_reference_return() = true;
Anders Carlssone9f2f452009-05-27 03:37:57 +000046 a = bool_reference_return();
Anders Carlssone78ccb42010-02-03 19:13:55 +000047
48 struct { const bool& b; } b = { true };
Anders Carlssone04d1c72009-05-20 01:03:17 +000049}
50
Anders Carlsson4bbab922009-05-20 00:36:58 +000051void test_scalar() {
52 int a = 10;
Anders Carlsson4bbab922009-05-20 00:36:58 +000053 f(a);
Anders Carlssone04d1c72009-05-20 01:03:17 +000054
Anders Carlsson38d068e2009-05-20 01:24:22 +000055 struct { int bitfield : 3; } s = { 3 };
Anders Carlsson9f75e6b2009-05-20 01:27:39 +000056 f(s.bitfield);
Anders Carlsson38d068e2009-05-20 01:24:22 +000057
Anders Carlssone04d1c72009-05-20 01:03:17 +000058 f(10);
Eli Friedman5df0d422009-05-20 02:31:19 +000059
60 __attribute((vector_size(16))) typedef int vec4;
61 f((vec4){1,2,3,4}[0]);
Anders Carlsson48265682009-05-27 01:45:47 +000062
63 int_reference_return() = 10;
Anders Carlssone9f2f452009-05-27 03:37:57 +000064 a = int_reference_return();
Anders Carlssone78ccb42010-02-03 19:13:55 +000065
66 struct { const int& a; } agg = { 10 };
Anders Carlsson4bbab922009-05-20 00:36:58 +000067}
68
69void test_complex() {
70 _Complex int a = 10i;
Anders Carlsson4bbab922009-05-20 00:36:58 +000071 f(a);
Anders Carlsson7cd3a642009-05-20 01:35:03 +000072
73 f(10i);
Anders Carlsson48265682009-05-27 01:45:47 +000074
75 complex_int_reference_return() = 10i;
Anders Carlssone9f2f452009-05-27 03:37:57 +000076 a = complex_int_reference_return();
Anders Carlssone78ccb42010-02-03 19:13:55 +000077
78 struct { const _Complex int &a; } agg = { 10i };
Anders Carlsson4bbab922009-05-20 00:36:58 +000079}
80
81void test_aggregate() {
82 C c;
Anders Carlsson4bbab922009-05-20 00:36:58 +000083 f(c);
Eli Friedman5df0d422009-05-20 02:31:19 +000084
Anders Carlsson48265682009-05-27 01:45:47 +000085 f(aggregate_return());
Anders Carlsson68ea78a2009-05-27 01:46:48 +000086 aggregate_reference_return().a = 10;
Anders Carlssone70e8f72009-05-27 16:45:02 +000087
88 c = aggregate_reference_return();
Anders Carlssone78ccb42010-02-03 19:13:55 +000089
90 struct { const C& a; } agg = { C() };
Anders Carlsson4bbab922009-05-20 00:36:58 +000091}
92
Eli Friedmand54b6ac2009-05-27 04:56:12 +000093int& reference_return() {
94 return g;
95}
Eli Friedman4a187842009-05-27 05:39:06 +000096
97int reference_decl() {
98 int& a = g;
99 const int& b = 1;
100 return a+b;
101}
Anders Carlssonfaf86642009-09-01 21:18:52 +0000102
103struct A {
104 int& b();
105};
106
107void f(A* a) {
108 int b = a->b();
109}
Anders Carlsson26bc2202009-10-03 16:30:22 +0000110
111// PR5122
112void *foo = 0;
113void * const & kFoo = foo;
114
Anders Carlssonb3f74422009-10-15 00:51:46 +0000115struct D : C { D(); ~D(); };
116
117void h() {
118 // CHECK: call void @_ZN1DD1Ev
119 const C& c = D();
120}
121
Anders Carlssone1b7ea12009-10-18 23:09:21 +0000122namespace T {
123 struct A {
124 A();
125 ~A();
126 };
127
128 struct B {
129 B();
130 ~B();
131 A f();
132 };
133
134 void f() {
135 // CHECK: call void @_ZN1T1BC1Ev
136 // CHECK: call void @_ZN1T1B1fEv
137 // CHECK: call void @_ZN1T1BD1Ev
138 const A& a = B().f();
139 // CHECK: call void @_ZN1T1fEv
140 f();
141 // CHECK: call void @_ZN1T1AD1Ev
142 }
143}
144
Anders Carlsson86aa0cd2009-10-19 18:28:22 +0000145// PR5227.
146namespace PR5227 {
147void f(int &a) {
148 (a = 10) = 20;
149}
150}
Sebastian Redl5d484e82009-11-23 17:18:46 +0000151
152// PR5590
153struct s0;
154struct s1 { struct s0 &s0; };
155void f0(s1 a) { s1 b = a; }
Douglas Gregor33fd1fc2010-03-24 23:14:04 +0000156
157// PR6024
158// CHECK: @_Z2f2v()
Chris Lattner35b21b82010-06-27 01:06:27 +0000159// CHECK: alloca i32,
160// CHECK-NEXT: store
161// CHECK-NEXT: ret
Douglas Gregor33fd1fc2010-03-24 23:14:04 +0000162const int &f2() { return 0; }
Chandler Carruth761c94e2010-05-16 09:32:51 +0000163
164// Don't constant fold const reference parameters with default arguments to
165// their default arguments.
166namespace N1 {
167 const int foo = 1;
168 // CHECK: @_ZN2N14test
Anders Carlsson045a6d82010-06-27 17:52:15 +0000169 void test(const int& arg = foo) {
Chandler Carruth761c94e2010-05-16 09:32:51 +0000170 // Ensure this array is on the stack where we can set values instead of
171 // being a global constant.
172 // CHECK: %args_array = alloca
173 const int* const args_array[] = { &arg };
174 }
175}
Douglas Gregor60dcb842010-05-20 08:36:28 +0000176
177// Bind to subobjects while extending the life of the complete object.
178namespace N2 {
179 class X {
180 public:
181 X(const X&);
182 X &operator=(const X&);
183 ~X();
184 };
185
186 struct P {
187 X first;
188 };
189
190 P getP();
191
Stephen Lin93ab6bf2013-08-15 06:47:53 +0000192 // CHECK-LABEL: define void @_ZN2N21fEi
Douglas Gregor60dcb842010-05-20 08:36:28 +0000193 // CHECK: call void @_ZN2N24getPEv
194 // CHECK: getelementptr inbounds
195 // CHECK: store i32 17
196 // CHECK: call void @_ZN2N21PD1Ev
197 void f(int i) {
198 const X& xr = getP().first;
199 i = 17;
200 }
201
202 struct SpaceWaster {
203 int i, j;
204 };
205
206 struct ReallyHasX {
207 X x;
208 };
209
210 struct HasX : ReallyHasX { };
211
212 struct HasXContainer {
213 HasX has;
214 };
215
216 struct Y : SpaceWaster, HasXContainer { };
217 struct Z : SpaceWaster, Y { };
218
219 Z getZ();
220
Stephen Lin93ab6bf2013-08-15 06:47:53 +0000221 // CHECK-LABEL: define void @_ZN2N21gEi
Douglas Gregor60dcb842010-05-20 08:36:28 +0000222 // CHECK: call void @_ZN2N24getZEv
Douglas Gregor2d6b0e92010-05-22 05:17:18 +0000223 // CHECK: {{getelementptr inbounds.*i32 0, i32 0}}
224 // CHECK: {{getelementptr inbounds.*i32 0, i32 0}}
225 // CHECK: store i32 19
226 // CHECK: call void @_ZN2N21ZD1Ev
227 // CHECK: ret void
Douglas Gregor60dcb842010-05-20 08:36:28 +0000228 void g(int i) {
229 const X &xr = getZ().has.x;
230 i = 19;
231 }
232}
Anders Carlsson045a6d82010-06-27 17:52:15 +0000233
234namespace N3 {
235
236// PR7326
237
238struct A {
239 explicit A(int);
240 ~A();
241};
242
Stephen Lin93ab6bf2013-08-15 06:47:53 +0000243// CHECK-LABEL: define internal void @__cxx_global_var_init
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700244// CHECK: call void @_ZN2N31AC1Ei(%"struct.N3::A"* @_ZGRN2N35sA123E_, i32 123)
Anders Carlsson045a6d82010-06-27 17:52:15 +0000245// CHECK: call i32 @__cxa_atexit
246// CHECK: ret void
247const A &sA123 = A(123);
248}
249
250namespace N4 {
251
252struct A {
253 A();
254 ~A();
255};
256
257void f() {
Stephen Lin93ab6bf2013-08-15 06:47:53 +0000258 // CHECK-LABEL: define void @_ZN2N41fEv
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700259 // CHECK: call void @_ZN2N41AC1Ev(%"struct.N4::A"* @_ZGRZN2N41fEvE2ar_)
Anders Carlsson045a6d82010-06-27 17:52:15 +0000260 // CHECK: call i32 @__cxa_atexit
261 // CHECK: ret void
262 static const A& ar = A();
263
264}
265}
266
Eli Friedman545aa7a2011-03-16 22:34:09 +0000267// PR9494
268namespace N5 {
269struct AnyS { bool b; };
270void f(const bool&);
271AnyS g();
272void h() {
273 // CHECK: call i8 @_ZN2N51gEv()
274 // CHECK: call void @_ZN2N51fERKb(i8*
275 f(g().b);
276}
277}
Douglas Gregor03e80032011-06-21 17:03:29 +0000278
279// PR9565
280namespace PR9565 {
281 struct a { int a : 10, b : 10; };
Stephen Lin93ab6bf2013-08-15 06:47:53 +0000282 // CHECK-LABEL: define void @_ZN6PR95651fEv()
Douglas Gregor03e80032011-06-21 17:03:29 +0000283 void f() {
284 // CHECK: call void @llvm.memcpy
285 a x = { 0, 0 };
Chandler Carruth72d2dab2012-12-06 11:14:44 +0000286 // CHECK: [[WITH_SEVENTEEN:%[.a-zA-Z0-9]+]] = or i32 [[WITHOUT_SEVENTEEN:%[.a-zA-Z0-9]+]], 17
287 // CHECK: store i32 [[WITH_SEVENTEEN]], i32* [[XA:%[.a-zA-Z0-9]+]]
Douglas Gregor03e80032011-06-21 17:03:29 +0000288 x.a = 17;
289 // CHECK-NEXT: bitcast
Chandler Carruth72d2dab2012-12-06 11:14:44 +0000290 // CHECK-NEXT: load
Douglas Gregor03e80032011-06-21 17:03:29 +0000291 // CHECK-NEXT: shl
292 // CHECK-NEXT: ashr
293 // CHECK-NEXT: store i32
294 // CHECK-NEXT: store i32*
295 const int &y = x.a;
296 // CHECK-NEXT: bitcast
297 // CHECK-NEXT: load
298 // CHECK-NEXT: and
Chandler Carruth72d2dab2012-12-06 11:14:44 +0000299 // CHECK-NEXT: or i32 {{.*}}, 19456
Douglas Gregor03e80032011-06-21 17:03:29 +0000300 // CHECK-NEXT: store i32
301 x.b = 19;
302 // CHECK-NEXT: ret void
303 }
304}
Eli Friedman2f77b3d2011-11-16 00:42:57 +0000305
306namespace N6 {
307 extern struct x {char& x;}y;
308 int a() { return y.x; }
Stephen Lin93ab6bf2013-08-15 06:47:53 +0000309 // CHECK-LABEL: define i32 @_ZN2N61aEv
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700310 // CHECK: [[REFLOAD3:%.*]] = load i8*, i8** getelementptr inbounds (%"struct.N6::x", %"struct.N6::x"* @_ZN2N61yE, i32 0, i32 0), align 8
311 // CHECK: load i8, i8* [[REFLOAD3]], align 1
Eli Friedman2f77b3d2011-11-16 00:42:57 +0000312}