309 lines · cpp
1// RUN: not %clang_cc1 -triple x86_64-apple-darwin -verify -emit-llvm -o - %s | FileCheck %s2void t1() {3 // CHECK-LABEL: define{{.*}} void @_Z2t1v4 // CHECK: [[REFLOAD:%.*]] = load ptr, ptr @a, align 85 // CHECK: load i32, ptr [[REFLOAD]], align 46 extern int& a;7 int b = a; 8}9 10void t2(int& a) {11 // CHECK-LABEL: define{{.*}} void @_Z2t2Ri12 // CHECK: [[REFLOAD2:%.*]] = load ptr, ptr {{.*}}, align 813 // CHECK: load i32, ptr [[REFLOAD2]], align 414 int b = a;15}16 17int g;18int& gr = g;19int& grr = gr;20void t3() {21 int b = gr;22}23 24// Test reference binding.25 26struct C { int a; };27void f(const bool&);28void f(const int&);29void f(const _Complex int&);30void f(const C&);31 32C aggregate_return();33 34bool& bool_reference_return();35int& int_reference_return();36_Complex int& complex_int_reference_return();37C& aggregate_reference_return();38 39void test_bool() {40 bool a = true;41 f(a);42 43 f(true);44 45 bool_reference_return() = true;46 a = bool_reference_return();47 48 struct { const bool& b; } b = { true };49}50 51void test_scalar() {52 int a = 10;53 f(a);54 55 struct { int bitfield : 3; } s = { 3 };56 f(s.bitfield);57 58 f(10);59 60 __attribute((vector_size(16))) typedef int vec4;61 f((vec4){1,2,3,4}[0]);62 63 int_reference_return() = 10;64 a = int_reference_return();65 66 struct { const int& a; } agg = { 10 };67}68 69void test_complex() {70 _Complex int a = 10i;71 f(a);72 73 f(10i);74 75 complex_int_reference_return() = 10i;76 a = complex_int_reference_return();77 78 struct { const _Complex int &a; } agg = { 10i };79}80 81void test_aggregate() {82 C c;83 f(c);84 85 f(aggregate_return());86 aggregate_reference_return().a = 10;87 88 c = aggregate_reference_return();89 90 struct { const C& a; } agg = { C() };91}92 93int& reference_return() {94 return g;95}96 97int reference_decl() {98 int& a = g;99 const int& b = 1;100 return a+b;101}102 103struct A {104 int& b();105};106 107void f(A* a) {108 int b = a->b();109}110 111// PR5122112void *foo = 0;113void * const & kFoo = foo;114 115struct D : C { D(); ~D(); };116 117void h() {118 // CHECK: call void @_ZN1DD1Ev119 const C& c = D();120}121 122namespace 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 @_ZN1T1BC1Ev136 // CHECK: call void @_ZN1T1B1fEv137 // CHECK: call void @_ZN1T1BD1Ev138 const A& a = B().f();139 // CHECK: call void @_ZN1T1fEv140 f();141 // CHECK: call void @_ZN1T1AD1Ev142 }143}144 145// PR5227.146namespace PR5227 {147void f(int &a) {148 (a = 10) = 20;149}150}151 152// PR5590153struct s0;154struct s1 { struct s0 &s0; };155void f0(s1 a) { s1 b = a; }156 157// PR6024158// CHECK: @_Z2f2v()159// CHECK: alloca i32,160// CHECK-NEXT: store161// CHECK-NEXT: ret162const int &f2() { return 0; }163 164// Don't constant fold const reference parameters with default arguments to165// their default arguments.166namespace N1 {167 const int foo = 1;168 // CHECK: @_ZN2N14test169 void test(const int& arg = foo) {170 // Ensure this array is on the stack where we can set values instead of171 // being a global constant.172 // CHECK: %args_array = alloca173 const int* const args_array[] = { &arg };174 }175}176 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 192 // CHECK-LABEL: define{{.*}} void @_ZN2N21fEi193 // CHECK: call void @_ZN2N24getPEv194 // CHECK: store i32 17195 // CHECK: call void @_ZN2N21PD1Ev196 void f(int i) {197 const X& xr = getP().first;198 i = 17;199 }200 201 struct SpaceWaster {202 int i, j;203 };204 205 struct ReallyHasX {206 X x;207 };208 209 struct HasX : ReallyHasX { };210 211 struct HasXContainer {212 HasX has;213 };214 215 struct Y : SpaceWaster, HasXContainer { };216 struct Z : SpaceWaster, Y { };217 218 Z getZ();219 220 // CHECK-LABEL: define{{.*}} void @_ZN2N21gEi221 // CHECK: call void @_ZN2N24getZEv222 // CHECK: {{getelementptr inbounds.*i64 16}}223 // CHECK: store i32 19224 // CHECK: call void @_ZN2N21ZD1Ev225 // CHECK: ret void226 void g(int i) {227 const X &xr = getZ().has.x;228 i = 19; 229 }230}231 232namespace N3 {233 234// PR7326235 236struct A {237 explicit A(int);238 ~A();239};240 241// CHECK-LABEL: define internal void @__cxx_global_var_init242// CHECK: call void @_ZN2N31AC1Ei(ptr {{[^,]*}} @_ZGRN2N35sA123E_, i32 noundef 123)243// CHECK: call i32 @__cxa_atexit244// CHECK: ret void245const A &sA123 = A(123);246}247 248namespace N4 {249 250struct A {251 A();252 ~A();253};254 255void f() {256 // CHECK-LABEL: define{{.*}} void @_ZN2N41fEv257 // CHECK: call void @_ZN2N41AC1Ev(ptr {{[^,]*}} @_ZGRZN2N41fEvE2ar_)258 // CHECK: call i32 @__cxa_atexit259 // CHECK: ret void260 static const A& ar = A();261 262}263}264 265// PR9494266namespace N5 {267struct AnyS { bool b; };268void f(const bool&);269AnyS g();270void h() {271 // CHECK: call i8 @_ZN2N51gEv()272 // CHECK: call void @_ZN2N51fERKb(ptr273 f(g().b);274}275}276 277// PR9565278namespace PR9565 {279 struct a { int a : 10, b : 10; };280 // CHECK-LABEL: define{{.*}} void @_ZN6PR95651fEv()281 void f() {282 // CHECK: call void @llvm.memcpy283 a x = { 0, 0 };284 // CHECK: [[WITH_SEVENTEEN:%[.a-zA-Z0-9]+]] = or i32 [[WITHOUT_SEVENTEEN:%[.a-zA-Z0-9]+]], 17285 // CHECK: store i32 [[WITH_SEVENTEEN]], ptr [[XA:%[.a-zA-Z0-9]+]]286 x.a = 17;287 // CHECK-NEXT: load288 // CHECK-NEXT: shl289 // CHECK-NEXT: ashr290 // CHECK-NEXT: store i32291 // CHECK-NEXT: store ptr292 const int &y = x.a;293 // CHECK-NEXT: load294 // CHECK-NEXT: and295 // CHECK-NEXT: or i32 {{.*}}, 19456296 // CHECK-NEXT: store i32297 x.b = 19;298 // CHECK-NEXT: ret void299 }300}301 302namespace N6 {303 extern struct x {char& x;}y;304 int a() { return y.x; }305 // CHECK-LABEL: define{{.*}} i32 @_ZN2N61aEv306 // CHECK: [[REFLOAD3:%.*]] = load ptr, ptr @_ZN2N61yE, align 8307 // CHECK: load i8, ptr [[REFLOAD3]], align 1308}309