196e7813f08c6adf1d8657b0da86741b54e850fd7Rafael Espindola// RUN: not %clang_cc1 -triple x86_64-apple-darwin -verify -emit-llvm -o - %s | FileCheck %s 2c8667a866bfc1d9f807282f2de5644d6aa4e9423Anders Carlssonvoid t1() { 393ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define void @_Z2t1v 42f77b3d57031ded0de2b7b977fb63b4660f82624Eli Friedman // CHECK: [[REFLOAD:%.*]] = load i32** @a, align 8 52f77b3d57031ded0de2b7b977fb63b4660f82624Eli Friedman // CHECK: load i32* [[REFLOAD]], align 4 6c8667a866bfc1d9f807282f2de5644d6aa4e9423Anders Carlsson extern int& a; 7c8667a866bfc1d9f807282f2de5644d6aa4e9423Anders Carlsson int b = a; 8c8667a866bfc1d9f807282f2de5644d6aa4e9423Anders Carlsson} 9c8667a866bfc1d9f807282f2de5644d6aa4e9423Anders Carlsson 10c8667a866bfc1d9f807282f2de5644d6aa4e9423Anders Carlssonvoid t2(int& a) { 1193ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define void @_Z2t2Ri 122f77b3d57031ded0de2b7b977fb63b4660f82624Eli Friedman // CHECK: [[REFLOAD2:%.*]] = load i32** {{.*}}, align 8 132f77b3d57031ded0de2b7b977fb63b4660f82624Eli Friedman // CHECK: load i32* [[REFLOAD2]], align 4 14c8667a866bfc1d9f807282f2de5644d6aa4e9423Anders Carlsson int b = a; 15c8667a866bfc1d9f807282f2de5644d6aa4e9423Anders Carlsson} 16c8667a866bfc1d9f807282f2de5644d6aa4e9423Anders Carlsson 17c8667a866bfc1d9f807282f2de5644d6aa4e9423Anders Carlssonint g; 18c8667a866bfc1d9f807282f2de5644d6aa4e9423Anders Carlssonint& gr = g; 1950c39ea4858265f3f5f42a0c624557ce2281936bEli Friedmanint& grr = gr; 20c8667a866bfc1d9f807282f2de5644d6aa4e9423Anders Carlssonvoid t3() { 21c8667a866bfc1d9f807282f2de5644d6aa4e9423Anders Carlsson int b = gr; 22c8667a866bfc1d9f807282f2de5644d6aa4e9423Anders Carlsson} 234bbab92167713bf4f79c0b14dcc4e83d08ac4019Anders Carlsson 244bbab92167713bf4f79c0b14dcc4e83d08ac4019Anders Carlsson// Test reference binding. 254bbab92167713bf4f79c0b14dcc4e83d08ac4019Anders Carlsson 2668ea78a093271301dc6396fc683644d8e13a90ddAnders Carlssonstruct C { int a; }; 27e04d1c77ae15a6e973e2fac7723f6c364884f58dAnders Carlssonvoid f(const bool&); 284bbab92167713bf4f79c0b14dcc4e83d08ac4019Anders Carlssonvoid f(const int&); 294bbab92167713bf4f79c0b14dcc4e83d08ac4019Anders Carlssonvoid f(const _Complex int&); 304bbab92167713bf4f79c0b14dcc4e83d08ac4019Anders Carlssonvoid f(const C&); 314bbab92167713bf4f79c0b14dcc4e83d08ac4019Anders Carlsson 32482656833a71b63f67f3e93ee8c2d45b3d351ca8Anders CarlssonC aggregate_return(); 33482656833a71b63f67f3e93ee8c2d45b3d351ca8Anders Carlsson 34482656833a71b63f67f3e93ee8c2d45b3d351ca8Anders Carlssonbool& bool_reference_return(); 35482656833a71b63f67f3e93ee8c2d45b3d351ca8Anders Carlssonint& int_reference_return(); 36482656833a71b63f67f3e93ee8c2d45b3d351ca8Anders Carlsson_Complex int& complex_int_reference_return(); 3768ea78a093271301dc6396fc683644d8e13a90ddAnders CarlssonC& aggregate_reference_return(); 385df0d426026b3820b5f0b13a8d4e60e9373d8d9dEli Friedman 39e04d1c77ae15a6e973e2fac7723f6c364884f58dAnders Carlssonvoid test_bool() { 40e04d1c77ae15a6e973e2fac7723f6c364884f58dAnders Carlsson bool a = true; 41e04d1c77ae15a6e973e2fac7723f6c364884f58dAnders Carlsson f(a); 42e04d1c77ae15a6e973e2fac7723f6c364884f58dAnders Carlsson 43e04d1c77ae15a6e973e2fac7723f6c364884f58dAnders Carlsson f(true); 44482656833a71b63f67f3e93ee8c2d45b3d351ca8Anders Carlsson 45482656833a71b63f67f3e93ee8c2d45b3d351ca8Anders Carlsson bool_reference_return() = true; 46e9f2f45fe9bf79bd4aea47fa1ad9204b68510fd9Anders Carlsson a = bool_reference_return(); 47e78ccb4d609a113c3e06a9c4583e845e90b1a037Anders Carlsson 48e78ccb4d609a113c3e06a9c4583e845e90b1a037Anders Carlsson struct { const bool& b; } b = { true }; 49e04d1c77ae15a6e973e2fac7723f6c364884f58dAnders Carlsson} 50e04d1c77ae15a6e973e2fac7723f6c364884f58dAnders Carlsson 514bbab92167713bf4f79c0b14dcc4e83d08ac4019Anders Carlssonvoid test_scalar() { 524bbab92167713bf4f79c0b14dcc4e83d08ac4019Anders Carlsson int a = 10; 534bbab92167713bf4f79c0b14dcc4e83d08ac4019Anders Carlsson f(a); 54e04d1c77ae15a6e973e2fac7723f6c364884f58dAnders Carlsson 5538d068e8f13a119b89a3b8b0f79f35cab1ffd09aAnders Carlsson struct { int bitfield : 3; } s = { 3 }; 569f75e6be16b9df33d58ec73955b3e3e3c71b2682Anders Carlsson f(s.bitfield); 5738d068e8f13a119b89a3b8b0f79f35cab1ffd09aAnders Carlsson 58e04d1c77ae15a6e973e2fac7723f6c364884f58dAnders Carlsson f(10); 595df0d426026b3820b5f0b13a8d4e60e9373d8d9dEli Friedman 605df0d426026b3820b5f0b13a8d4e60e9373d8d9dEli Friedman __attribute((vector_size(16))) typedef int vec4; 615df0d426026b3820b5f0b13a8d4e60e9373d8d9dEli Friedman f((vec4){1,2,3,4}[0]); 62482656833a71b63f67f3e93ee8c2d45b3d351ca8Anders Carlsson 63482656833a71b63f67f3e93ee8c2d45b3d351ca8Anders Carlsson int_reference_return() = 10; 64e9f2f45fe9bf79bd4aea47fa1ad9204b68510fd9Anders Carlsson a = int_reference_return(); 65e78ccb4d609a113c3e06a9c4583e845e90b1a037Anders Carlsson 66e78ccb4d609a113c3e06a9c4583e845e90b1a037Anders Carlsson struct { const int& a; } agg = { 10 }; 674bbab92167713bf4f79c0b14dcc4e83d08ac4019Anders Carlsson} 684bbab92167713bf4f79c0b14dcc4e83d08ac4019Anders Carlsson 694bbab92167713bf4f79c0b14dcc4e83d08ac4019Anders Carlssonvoid test_complex() { 704bbab92167713bf4f79c0b14dcc4e83d08ac4019Anders Carlsson _Complex int a = 10i; 714bbab92167713bf4f79c0b14dcc4e83d08ac4019Anders Carlsson f(a); 727cd3a648b3d3057805c022b9470bbdfe21d732a5Anders Carlsson 737cd3a648b3d3057805c022b9470bbdfe21d732a5Anders Carlsson f(10i); 74482656833a71b63f67f3e93ee8c2d45b3d351ca8Anders Carlsson 75482656833a71b63f67f3e93ee8c2d45b3d351ca8Anders Carlsson complex_int_reference_return() = 10i; 76e9f2f45fe9bf79bd4aea47fa1ad9204b68510fd9Anders Carlsson a = complex_int_reference_return(); 77e78ccb4d609a113c3e06a9c4583e845e90b1a037Anders Carlsson 78e78ccb4d609a113c3e06a9c4583e845e90b1a037Anders Carlsson struct { const _Complex int &a; } agg = { 10i }; 794bbab92167713bf4f79c0b14dcc4e83d08ac4019Anders Carlsson} 804bbab92167713bf4f79c0b14dcc4e83d08ac4019Anders Carlsson 814bbab92167713bf4f79c0b14dcc4e83d08ac4019Anders Carlssonvoid test_aggregate() { 824bbab92167713bf4f79c0b14dcc4e83d08ac4019Anders Carlsson C c; 834bbab92167713bf4f79c0b14dcc4e83d08ac4019Anders Carlsson f(c); 845df0d426026b3820b5f0b13a8d4e60e9373d8d9dEli Friedman 85482656833a71b63f67f3e93ee8c2d45b3d351ca8Anders Carlsson f(aggregate_return()); 8668ea78a093271301dc6396fc683644d8e13a90ddAnders Carlsson aggregate_reference_return().a = 10; 87e70e8f7fef3efb3d526ee25b3a0e2a4bf67a04b6Anders Carlsson 88e70e8f7fef3efb3d526ee25b3a0e2a4bf67a04b6Anders Carlsson c = aggregate_reference_return(); 89e78ccb4d609a113c3e06a9c4583e845e90b1a037Anders Carlsson 90e78ccb4d609a113c3e06a9c4583e845e90b1a037Anders Carlsson struct { const C& a; } agg = { C() }; 914bbab92167713bf4f79c0b14dcc4e83d08ac4019Anders Carlsson} 924bbab92167713bf4f79c0b14dcc4e83d08ac4019Anders Carlsson 93d54b6ac2f4f6f0bd0076cbfa885b57277066f06cEli Friedmanint& reference_return() { 94d54b6ac2f4f6f0bd0076cbfa885b57277066f06cEli Friedman return g; 95d54b6ac2f4f6f0bd0076cbfa885b57277066f06cEli Friedman} 964a18784dea763be146df68546e6dbf4233c33077Eli Friedman 974a18784dea763be146df68546e6dbf4233c33077Eli Friedmanint reference_decl() { 984a18784dea763be146df68546e6dbf4233c33077Eli Friedman int& a = g; 994a18784dea763be146df68546e6dbf4233c33077Eli Friedman const int& b = 1; 1004a18784dea763be146df68546e6dbf4233c33077Eli Friedman return a+b; 1014a18784dea763be146df68546e6dbf4233c33077Eli Friedman} 102faf86648bfab7e0fa975e2b32c10fe1d8b461e8cAnders Carlsson 103faf86648bfab7e0fa975e2b32c10fe1d8b461e8cAnders Carlssonstruct A { 104faf86648bfab7e0fa975e2b32c10fe1d8b461e8cAnders Carlsson int& b(); 105faf86648bfab7e0fa975e2b32c10fe1d8b461e8cAnders Carlsson}; 106faf86648bfab7e0fa975e2b32c10fe1d8b461e8cAnders Carlsson 107faf86648bfab7e0fa975e2b32c10fe1d8b461e8cAnders Carlssonvoid f(A* a) { 108faf86648bfab7e0fa975e2b32c10fe1d8b461e8cAnders Carlsson int b = a->b(); 109faf86648bfab7e0fa975e2b32c10fe1d8b461e8cAnders Carlsson} 11026bc220377705292a0519a71d3ea3aef68fcfec6Anders Carlsson 11126bc220377705292a0519a71d3ea3aef68fcfec6Anders Carlsson// PR5122 11226bc220377705292a0519a71d3ea3aef68fcfec6Anders Carlssonvoid *foo = 0; 11326bc220377705292a0519a71d3ea3aef68fcfec6Anders Carlssonvoid * const & kFoo = foo; 11426bc220377705292a0519a71d3ea3aef68fcfec6Anders Carlsson 115b3f744252a460c45e2e77053491285978286c384Anders Carlssonstruct D : C { D(); ~D(); }; 116b3f744252a460c45e2e77053491285978286c384Anders Carlsson 117b3f744252a460c45e2e77053491285978286c384Anders Carlssonvoid h() { 118b3f744252a460c45e2e77053491285978286c384Anders Carlsson // CHECK: call void @_ZN1DD1Ev 119b3f744252a460c45e2e77053491285978286c384Anders Carlsson const C& c = D(); 120b3f744252a460c45e2e77053491285978286c384Anders Carlsson} 121b3f744252a460c45e2e77053491285978286c384Anders Carlsson 122e1b7ea1b025c54b082f838ede2f483e657481fdcAnders Carlssonnamespace T { 123e1b7ea1b025c54b082f838ede2f483e657481fdcAnders Carlsson struct A { 124e1b7ea1b025c54b082f838ede2f483e657481fdcAnders Carlsson A(); 125e1b7ea1b025c54b082f838ede2f483e657481fdcAnders Carlsson ~A(); 126e1b7ea1b025c54b082f838ede2f483e657481fdcAnders Carlsson }; 127e1b7ea1b025c54b082f838ede2f483e657481fdcAnders Carlsson 128e1b7ea1b025c54b082f838ede2f483e657481fdcAnders Carlsson struct B { 129e1b7ea1b025c54b082f838ede2f483e657481fdcAnders Carlsson B(); 130e1b7ea1b025c54b082f838ede2f483e657481fdcAnders Carlsson ~B(); 131e1b7ea1b025c54b082f838ede2f483e657481fdcAnders Carlsson A f(); 132e1b7ea1b025c54b082f838ede2f483e657481fdcAnders Carlsson }; 133e1b7ea1b025c54b082f838ede2f483e657481fdcAnders Carlsson 134e1b7ea1b025c54b082f838ede2f483e657481fdcAnders Carlsson void f() { 135e1b7ea1b025c54b082f838ede2f483e657481fdcAnders Carlsson // CHECK: call void @_ZN1T1BC1Ev 136e1b7ea1b025c54b082f838ede2f483e657481fdcAnders Carlsson // CHECK: call void @_ZN1T1B1fEv 137e1b7ea1b025c54b082f838ede2f483e657481fdcAnders Carlsson // CHECK: call void @_ZN1T1BD1Ev 138e1b7ea1b025c54b082f838ede2f483e657481fdcAnders Carlsson const A& a = B().f(); 139e1b7ea1b025c54b082f838ede2f483e657481fdcAnders Carlsson // CHECK: call void @_ZN1T1fEv 140e1b7ea1b025c54b082f838ede2f483e657481fdcAnders Carlsson f(); 141e1b7ea1b025c54b082f838ede2f483e657481fdcAnders Carlsson // CHECK: call void @_ZN1T1AD1Ev 142e1b7ea1b025c54b082f838ede2f483e657481fdcAnders Carlsson } 143e1b7ea1b025c54b082f838ede2f483e657481fdcAnders Carlsson} 144e1b7ea1b025c54b082f838ede2f483e657481fdcAnders Carlsson 14586aa0cdfd5aa7b099efbcd612a014d1b5f0ff799Anders Carlsson// PR5227. 14686aa0cdfd5aa7b099efbcd612a014d1b5f0ff799Anders Carlssonnamespace PR5227 { 14786aa0cdfd5aa7b099efbcd612a014d1b5f0ff799Anders Carlssonvoid f(int &a) { 14886aa0cdfd5aa7b099efbcd612a014d1b5f0ff799Anders Carlsson (a = 10) = 20; 14986aa0cdfd5aa7b099efbcd612a014d1b5f0ff799Anders Carlsson} 15086aa0cdfd5aa7b099efbcd612a014d1b5f0ff799Anders Carlsson} 1515d484e8cf710207010720589d89602233de61d01Sebastian Redl 1525d484e8cf710207010720589d89602233de61d01Sebastian Redl// PR5590 1535d484e8cf710207010720589d89602233de61d01Sebastian Redlstruct s0; 1545d484e8cf710207010720589d89602233de61d01Sebastian Redlstruct s1 { struct s0 &s0; }; 1555d484e8cf710207010720589d89602233de61d01Sebastian Redlvoid f0(s1 a) { s1 b = a; } 15633fd1fc1814a5573c972840d49317989e20deaceDouglas Gregor 15733fd1fc1814a5573c972840d49317989e20deaceDouglas Gregor// PR6024 15833fd1fc1814a5573c972840d49317989e20deaceDouglas Gregor// CHECK: @_Z2f2v() 15935b21b884e5c3447a52a74d7ffaba966b07ac81fChris Lattner// CHECK: alloca i32, 16035b21b884e5c3447a52a74d7ffaba966b07ac81fChris Lattner// CHECK-NEXT: store 16135b21b884e5c3447a52a74d7ffaba966b07ac81fChris Lattner// CHECK-NEXT: ret 16233fd1fc1814a5573c972840d49317989e20deaceDouglas Gregorconst int &f2() { return 0; } 163761c94e3bffef0fcb8b4bbf202fd5ee73db134f3Chandler Carruth 164761c94e3bffef0fcb8b4bbf202fd5ee73db134f3Chandler Carruth// Don't constant fold const reference parameters with default arguments to 165761c94e3bffef0fcb8b4bbf202fd5ee73db134f3Chandler Carruth// their default arguments. 166761c94e3bffef0fcb8b4bbf202fd5ee73db134f3Chandler Carruthnamespace N1 { 167761c94e3bffef0fcb8b4bbf202fd5ee73db134f3Chandler Carruth const int foo = 1; 168761c94e3bffef0fcb8b4bbf202fd5ee73db134f3Chandler Carruth // CHECK: @_ZN2N14test 169045a6d84a0fa672eb5d914be1bb8f3baa226beb3Anders Carlsson void test(const int& arg = foo) { 170761c94e3bffef0fcb8b4bbf202fd5ee73db134f3Chandler Carruth // Ensure this array is on the stack where we can set values instead of 171761c94e3bffef0fcb8b4bbf202fd5ee73db134f3Chandler Carruth // being a global constant. 172761c94e3bffef0fcb8b4bbf202fd5ee73db134f3Chandler Carruth // CHECK: %args_array = alloca 173761c94e3bffef0fcb8b4bbf202fd5ee73db134f3Chandler Carruth const int* const args_array[] = { &arg }; 174761c94e3bffef0fcb8b4bbf202fd5ee73db134f3Chandler Carruth } 175761c94e3bffef0fcb8b4bbf202fd5ee73db134f3Chandler Carruth} 17660dcb8432cff2455488b9226b9cc65b80356146eDouglas Gregor 17760dcb8432cff2455488b9226b9cc65b80356146eDouglas Gregor// Bind to subobjects while extending the life of the complete object. 17860dcb8432cff2455488b9226b9cc65b80356146eDouglas Gregornamespace N2 { 17960dcb8432cff2455488b9226b9cc65b80356146eDouglas Gregor class X { 18060dcb8432cff2455488b9226b9cc65b80356146eDouglas Gregor public: 18160dcb8432cff2455488b9226b9cc65b80356146eDouglas Gregor X(const X&); 18260dcb8432cff2455488b9226b9cc65b80356146eDouglas Gregor X &operator=(const X&); 18360dcb8432cff2455488b9226b9cc65b80356146eDouglas Gregor ~X(); 18460dcb8432cff2455488b9226b9cc65b80356146eDouglas Gregor }; 18560dcb8432cff2455488b9226b9cc65b80356146eDouglas Gregor 18660dcb8432cff2455488b9226b9cc65b80356146eDouglas Gregor struct P { 18760dcb8432cff2455488b9226b9cc65b80356146eDouglas Gregor X first; 18860dcb8432cff2455488b9226b9cc65b80356146eDouglas Gregor }; 18960dcb8432cff2455488b9226b9cc65b80356146eDouglas Gregor 19060dcb8432cff2455488b9226b9cc65b80356146eDouglas Gregor P getP(); 19160dcb8432cff2455488b9226b9cc65b80356146eDouglas Gregor 19293ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define void @_ZN2N21fEi 19360dcb8432cff2455488b9226b9cc65b80356146eDouglas Gregor // CHECK: call void @_ZN2N24getPEv 19460dcb8432cff2455488b9226b9cc65b80356146eDouglas Gregor // CHECK: getelementptr inbounds 19560dcb8432cff2455488b9226b9cc65b80356146eDouglas Gregor // CHECK: store i32 17 19660dcb8432cff2455488b9226b9cc65b80356146eDouglas Gregor // CHECK: call void @_ZN2N21PD1Ev 19760dcb8432cff2455488b9226b9cc65b80356146eDouglas Gregor void f(int i) { 19860dcb8432cff2455488b9226b9cc65b80356146eDouglas Gregor const X& xr = getP().first; 19960dcb8432cff2455488b9226b9cc65b80356146eDouglas Gregor i = 17; 20060dcb8432cff2455488b9226b9cc65b80356146eDouglas Gregor } 20160dcb8432cff2455488b9226b9cc65b80356146eDouglas Gregor 20260dcb8432cff2455488b9226b9cc65b80356146eDouglas Gregor struct SpaceWaster { 20360dcb8432cff2455488b9226b9cc65b80356146eDouglas Gregor int i, j; 20460dcb8432cff2455488b9226b9cc65b80356146eDouglas Gregor }; 20560dcb8432cff2455488b9226b9cc65b80356146eDouglas Gregor 20660dcb8432cff2455488b9226b9cc65b80356146eDouglas Gregor struct ReallyHasX { 20760dcb8432cff2455488b9226b9cc65b80356146eDouglas Gregor X x; 20860dcb8432cff2455488b9226b9cc65b80356146eDouglas Gregor }; 20960dcb8432cff2455488b9226b9cc65b80356146eDouglas Gregor 21060dcb8432cff2455488b9226b9cc65b80356146eDouglas Gregor struct HasX : ReallyHasX { }; 21160dcb8432cff2455488b9226b9cc65b80356146eDouglas Gregor 21260dcb8432cff2455488b9226b9cc65b80356146eDouglas Gregor struct HasXContainer { 21360dcb8432cff2455488b9226b9cc65b80356146eDouglas Gregor HasX has; 21460dcb8432cff2455488b9226b9cc65b80356146eDouglas Gregor }; 21560dcb8432cff2455488b9226b9cc65b80356146eDouglas Gregor 21660dcb8432cff2455488b9226b9cc65b80356146eDouglas Gregor struct Y : SpaceWaster, HasXContainer { }; 21760dcb8432cff2455488b9226b9cc65b80356146eDouglas Gregor struct Z : SpaceWaster, Y { }; 21860dcb8432cff2455488b9226b9cc65b80356146eDouglas Gregor 21960dcb8432cff2455488b9226b9cc65b80356146eDouglas Gregor Z getZ(); 22060dcb8432cff2455488b9226b9cc65b80356146eDouglas Gregor 22193ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define void @_ZN2N21gEi 22260dcb8432cff2455488b9226b9cc65b80356146eDouglas Gregor // CHECK: call void @_ZN2N24getZEv 2232d6b0e94db30c0e2754d270753c6f75478e451bfDouglas Gregor // CHECK: {{getelementptr inbounds.*i32 0, i32 0}} 2242d6b0e94db30c0e2754d270753c6f75478e451bfDouglas Gregor // CHECK: {{getelementptr inbounds.*i32 0, i32 0}} 2252d6b0e94db30c0e2754d270753c6f75478e451bfDouglas Gregor // CHECK: store i32 19 2262d6b0e94db30c0e2754d270753c6f75478e451bfDouglas Gregor // CHECK: call void @_ZN2N21ZD1Ev 2272d6b0e94db30c0e2754d270753c6f75478e451bfDouglas Gregor // CHECK: ret void 22860dcb8432cff2455488b9226b9cc65b80356146eDouglas Gregor void g(int i) { 22960dcb8432cff2455488b9226b9cc65b80356146eDouglas Gregor const X &xr = getZ().has.x; 23060dcb8432cff2455488b9226b9cc65b80356146eDouglas Gregor i = 19; 23160dcb8432cff2455488b9226b9cc65b80356146eDouglas Gregor } 23260dcb8432cff2455488b9226b9cc65b80356146eDouglas Gregor} 233045a6d84a0fa672eb5d914be1bb8f3baa226beb3Anders Carlsson 234045a6d84a0fa672eb5d914be1bb8f3baa226beb3Anders Carlssonnamespace N3 { 235045a6d84a0fa672eb5d914be1bb8f3baa226beb3Anders Carlsson 236045a6d84a0fa672eb5d914be1bb8f3baa226beb3Anders Carlsson// PR7326 237045a6d84a0fa672eb5d914be1bb8f3baa226beb3Anders Carlsson 238045a6d84a0fa672eb5d914be1bb8f3baa226beb3Anders Carlssonstruct A { 239045a6d84a0fa672eb5d914be1bb8f3baa226beb3Anders Carlsson explicit A(int); 240045a6d84a0fa672eb5d914be1bb8f3baa226beb3Anders Carlsson ~A(); 241045a6d84a0fa672eb5d914be1bb8f3baa226beb3Anders Carlsson}; 242045a6d84a0fa672eb5d914be1bb8f3baa226beb3Anders Carlsson 24393ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define internal void @__cxx_global_var_init 2446bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// CHECK: call void @_ZN2N31AC1Ei(%"struct.N3::A"* @_ZGRN2N35sA123E_, i32 123) 245045a6d84a0fa672eb5d914be1bb8f3baa226beb3Anders Carlsson// CHECK: call i32 @__cxa_atexit 246045a6d84a0fa672eb5d914be1bb8f3baa226beb3Anders Carlsson// CHECK: ret void 247045a6d84a0fa672eb5d914be1bb8f3baa226beb3Anders Carlssonconst A &sA123 = A(123); 248045a6d84a0fa672eb5d914be1bb8f3baa226beb3Anders Carlsson} 249045a6d84a0fa672eb5d914be1bb8f3baa226beb3Anders Carlsson 250045a6d84a0fa672eb5d914be1bb8f3baa226beb3Anders Carlssonnamespace N4 { 251045a6d84a0fa672eb5d914be1bb8f3baa226beb3Anders Carlsson 252045a6d84a0fa672eb5d914be1bb8f3baa226beb3Anders Carlssonstruct A { 253045a6d84a0fa672eb5d914be1bb8f3baa226beb3Anders Carlsson A(); 254045a6d84a0fa672eb5d914be1bb8f3baa226beb3Anders Carlsson ~A(); 255045a6d84a0fa672eb5d914be1bb8f3baa226beb3Anders Carlsson}; 256045a6d84a0fa672eb5d914be1bb8f3baa226beb3Anders Carlsson 257045a6d84a0fa672eb5d914be1bb8f3baa226beb3Anders Carlssonvoid f() { 25893ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define void @_ZN2N41fEv 2596bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // CHECK: call void @_ZN2N41AC1Ev(%"struct.N4::A"* @_ZGRZN2N41fEvE2ar_) 260045a6d84a0fa672eb5d914be1bb8f3baa226beb3Anders Carlsson // CHECK: call i32 @__cxa_atexit 261045a6d84a0fa672eb5d914be1bb8f3baa226beb3Anders Carlsson // CHECK: ret void 262045a6d84a0fa672eb5d914be1bb8f3baa226beb3Anders Carlsson static const A& ar = A(); 263045a6d84a0fa672eb5d914be1bb8f3baa226beb3Anders Carlsson 264045a6d84a0fa672eb5d914be1bb8f3baa226beb3Anders Carlsson} 265045a6d84a0fa672eb5d914be1bb8f3baa226beb3Anders Carlsson} 266045a6d84a0fa672eb5d914be1bb8f3baa226beb3Anders Carlsson 267545aa7a0f57d2bb2fc0eef83daa499300273d983Eli Friedman// PR9494 268545aa7a0f57d2bb2fc0eef83daa499300273d983Eli Friedmannamespace N5 { 269545aa7a0f57d2bb2fc0eef83daa499300273d983Eli Friedmanstruct AnyS { bool b; }; 270545aa7a0f57d2bb2fc0eef83daa499300273d983Eli Friedmanvoid f(const bool&); 271545aa7a0f57d2bb2fc0eef83daa499300273d983Eli FriedmanAnyS g(); 272545aa7a0f57d2bb2fc0eef83daa499300273d983Eli Friedmanvoid h() { 273545aa7a0f57d2bb2fc0eef83daa499300273d983Eli Friedman // CHECK: call i8 @_ZN2N51gEv() 274545aa7a0f57d2bb2fc0eef83daa499300273d983Eli Friedman // CHECK: call void @_ZN2N51fERKb(i8* 275545aa7a0f57d2bb2fc0eef83daa499300273d983Eli Friedman f(g().b); 276545aa7a0f57d2bb2fc0eef83daa499300273d983Eli Friedman} 277545aa7a0f57d2bb2fc0eef83daa499300273d983Eli Friedman} 27803e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor 27903e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor// PR9565 28003e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregornamespace PR9565 { 28103e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor struct a { int a : 10, b : 10; }; 28293ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define void @_ZN6PR95651fEv() 28303e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor void f() { 28403e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor // CHECK: call void @llvm.memcpy 28503e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor a x = { 0, 0 }; 28672d2dab6058467036df73a5f668036a519043e5bChandler Carruth // CHECK: [[WITH_SEVENTEEN:%[.a-zA-Z0-9]+]] = or i32 [[WITHOUT_SEVENTEEN:%[.a-zA-Z0-9]+]], 17 28772d2dab6058467036df73a5f668036a519043e5bChandler Carruth // CHECK: store i32 [[WITH_SEVENTEEN]], i32* [[XA:%[.a-zA-Z0-9]+]] 28803e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor x.a = 17; 28903e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor // CHECK-NEXT: bitcast 29072d2dab6058467036df73a5f668036a519043e5bChandler Carruth // CHECK-NEXT: load 29103e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor // CHECK-NEXT: shl 29203e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor // CHECK-NEXT: ashr 29303e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor // CHECK-NEXT: store i32 29403e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor // CHECK-NEXT: store i32* 29503e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor const int &y = x.a; 29603e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor // CHECK-NEXT: bitcast 29703e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor // CHECK-NEXT: load 29803e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor // CHECK-NEXT: and 29972d2dab6058467036df73a5f668036a519043e5bChandler Carruth // CHECK-NEXT: or i32 {{.*}}, 19456 30003e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor // CHECK-NEXT: store i32 30103e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor x.b = 19; 30203e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor // CHECK-NEXT: ret void 30303e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor } 30403e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor} 3052f77b3d57031ded0de2b7b977fb63b4660f82624Eli Friedman 3062f77b3d57031ded0de2b7b977fb63b4660f82624Eli Friedmannamespace N6 { 3072f77b3d57031ded0de2b7b977fb63b4660f82624Eli Friedman extern struct x {char& x;}y; 3082f77b3d57031ded0de2b7b977fb63b4660f82624Eli Friedman int a() { return y.x; } 30993ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define i32 @_ZN2N61aEv 3102f77b3d57031ded0de2b7b977fb63b4660f82624Eli Friedman // CHECK: [[REFLOAD3:%.*]] = load i8** getelementptr inbounds (%"struct.N6::x"* @_ZN2N61yE, i32 0, i32 0), align 8 31132380594b6774af451cf34af79b086d6f920d052Eli Friedman // CHECK: load i8* [[REFLOAD3]], align 1 3122f77b3d57031ded0de2b7b977fb63b4660f82624Eli Friedman} 313