1d09020d87a69803b02c68eb6bf0b38e6ca660edaAnders Carlsson// RUN: %clang_cc1 -triple x86_64-apple-darwin -emit-llvm -o - %s | FileCheck %s 2942f4f33d02dba823594bd2d7b3d317cb01c74f8Fariborz Jahanian 3942f4f33d02dba823594bd2d7b3d317cb01c74f8Fariborz Jahanianextern "C" int printf(...); 4942f4f33d02dba823594bd2d7b3d317cb01c74f8Fariborz Jahanian 5942f4f33d02dba823594bd2d7b3d317cb01c74f8Fariborz Jahanianint init = 100; 6942f4f33d02dba823594bd2d7b3d317cb01c74f8Fariborz Jahanian 7942f4f33d02dba823594bd2d7b3d317cb01c74f8Fariborz Jahanianstruct M { 8942f4f33d02dba823594bd2d7b3d317cb01c74f8Fariborz Jahanian int iM; 9942f4f33d02dba823594bd2d7b3d317cb01c74f8Fariborz Jahanian M() : iM(init++) {} 10942f4f33d02dba823594bd2d7b3d317cb01c74f8Fariborz Jahanian}; 11942f4f33d02dba823594bd2d7b3d317cb01c74f8Fariborz Jahanian 12942f4f33d02dba823594bd2d7b3d317cb01c74f8Fariborz Jahanianstruct N { 13942f4f33d02dba823594bd2d7b3d317cb01c74f8Fariborz Jahanian int iN; 14942f4f33d02dba823594bd2d7b3d317cb01c74f8Fariborz Jahanian N() : iN(200) {} 15942f4f33d02dba823594bd2d7b3d317cb01c74f8Fariborz Jahanian N(N const & arg){this->iN = arg.iN; } 16942f4f33d02dba823594bd2d7b3d317cb01c74f8Fariborz Jahanian}; 17942f4f33d02dba823594bd2d7b3d317cb01c74f8Fariborz Jahanian 18942f4f33d02dba823594bd2d7b3d317cb01c74f8Fariborz Jahanianstruct P { 19942f4f33d02dba823594bd2d7b3d317cb01c74f8Fariborz Jahanian int iP; 20942f4f33d02dba823594bd2d7b3d317cb01c74f8Fariborz Jahanian P() : iP(init++) {} 21942f4f33d02dba823594bd2d7b3d317cb01c74f8Fariborz Jahanian}; 22942f4f33d02dba823594bd2d7b3d317cb01c74f8Fariborz Jahanian 23942f4f33d02dba823594bd2d7b3d317cb01c74f8Fariborz Jahanian 24176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK-LABEL: define linkonce_odr void @_ZN1XC1ERKS_(%struct.X* %this, %struct.X* dereferenceable({{[0-9]+}})) unnamed_addr 25942f4f33d02dba823594bd2d7b3d317cb01c74f8Fariborz Jahanianstruct X : M, N, P { // ... 261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump X() : f1(1.0), d1(2.0), i1(3), name("HELLO"), bf1(0xff), bf2(0xabcd), 271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump au_i1(1234), au1_4("MASKED") {} 281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump P p0; 291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump void pr() { 301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump printf("iM = %d iN = %d, m1.iM = %d\n", iM, iN, m1.iM); 311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump printf("im = %d p0.iP = %d, p1.iP = %d\n", iP, p0.iP, p1.iP); 321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump printf("f1 = %f d1 = %f i1 = %d name(%s) \n", f1, d1, i1, name); 331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump printf("bf1 = %x bf2 = %x\n", bf1, bf2); 341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump printf("au_i2 = %d\n", au_i2); 351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump printf("au1_1 = %s\n", au1_1); 361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump M m1; 381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump P p1; 391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump float f1; 401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump double d1; 411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump int i1; 421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump const char *name; 431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump unsigned bf1 : 8; 441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump unsigned bf2 : 16; 456d10ac9ef3435993d0ceae7782fbeee7659af30eEli Friedman int arr[2]; 466d10ac9ef3435993d0ceae7782fbeee7659af30eEli Friedman _Complex float complex; 47e64941280877d065a27e8cefd2a9038256d0e3acFariborz Jahanian 481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump union { 491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump int au_i1; 501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump int au_i2; 511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump }; 521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump union { 531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump const char * au1_1; 541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump float au1_2; 551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump int au1_3; 561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump const char * au1_4; 571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump }; 58942f4f33d02dba823594bd2d7b3d317cb01c74f8Fariborz Jahanian}; 59942f4f33d02dba823594bd2d7b3d317cb01c74f8Fariborz Jahanian 60eb0b6d556ff2b4a5053e89fd084eb34e44cea14cFariborz Jahanianstatic int ix = 1; 61eb0b6d556ff2b4a5053e89fd084eb34e44cea14cFariborz Jahanian// class with user-defined copy constructor. 62eb0b6d556ff2b4a5053e89fd084eb34e44cea14cFariborz Jahanianstruct S { 63eb0b6d556ff2b4a5053e89fd084eb34e44cea14cFariborz Jahanian S() : iS(ix++) { } 64eb0b6d556ff2b4a5053e89fd084eb34e44cea14cFariborz Jahanian S(const S& arg) { *this = arg; } 65eb0b6d556ff2b4a5053e89fd084eb34e44cea14cFariborz Jahanian int iS; 66eb0b6d556ff2b4a5053e89fd084eb34e44cea14cFariborz Jahanian}; 67eb0b6d556ff2b4a5053e89fd084eb34e44cea14cFariborz Jahanian 68eb0b6d556ff2b4a5053e89fd084eb34e44cea14cFariborz Jahanian// class with trivial copy constructor. 69eb0b6d556ff2b4a5053e89fd084eb34e44cea14cFariborz Jahanianstruct I { 70eb0b6d556ff2b4a5053e89fd084eb34e44cea14cFariborz Jahanian I() : iI(ix++) { } 71eb0b6d556ff2b4a5053e89fd084eb34e44cea14cFariborz Jahanian int iI; 72eb0b6d556ff2b4a5053e89fd084eb34e44cea14cFariborz Jahanian}; 73eb0b6d556ff2b4a5053e89fd084eb34e44cea14cFariborz Jahanian 74eb0b6d556ff2b4a5053e89fd084eb34e44cea14cFariborz Jahanianstruct XM { 75eb0b6d556ff2b4a5053e89fd084eb34e44cea14cFariborz Jahanian XM() { } 76eb0b6d556ff2b4a5053e89fd084eb34e44cea14cFariborz Jahanian double dXM; 77eb0b6d556ff2b4a5053e89fd084eb34e44cea14cFariborz Jahanian S ARR_S[3][4][2]; 78eb0b6d556ff2b4a5053e89fd084eb34e44cea14cFariborz Jahanian void pr() { 79eb0b6d556ff2b4a5053e89fd084eb34e44cea14cFariborz Jahanian for (unsigned i = 0; i < 3; i++) 80eb0b6d556ff2b4a5053e89fd084eb34e44cea14cFariborz Jahanian for (unsigned j = 0; j < 4; j++) 81eb0b6d556ff2b4a5053e89fd084eb34e44cea14cFariborz Jahanian for (unsigned k = 0; k < 2; k++) 82eb0b6d556ff2b4a5053e89fd084eb34e44cea14cFariborz Jahanian printf("ARR_S[%d][%d][%d] = %d\n", i,j,k, ARR_S[i][j][k].iS); 83eb0b6d556ff2b4a5053e89fd084eb34e44cea14cFariborz Jahanian for (unsigned i = 0; i < 3; i++) 84eb0b6d556ff2b4a5053e89fd084eb34e44cea14cFariborz Jahanian for (unsigned k = 0; k < 2; k++) 85eb0b6d556ff2b4a5053e89fd084eb34e44cea14cFariborz Jahanian printf("ARR_I[%d][%d] = %d\n", i,k, ARR_I[i][k].iI); 86eb0b6d556ff2b4a5053e89fd084eb34e44cea14cFariborz Jahanian } 87eb0b6d556ff2b4a5053e89fd084eb34e44cea14cFariborz Jahanian I ARR_I[3][2]; 88eb0b6d556ff2b4a5053e89fd084eb34e44cea14cFariborz Jahanian}; 89eb0b6d556ff2b4a5053e89fd084eb34e44cea14cFariborz Jahanian 901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpint main() { 911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump X a; 921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump X b(a); 931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump b.pr(); 941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump X x; 951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump X c(x); 961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump c.pr(); 97eb0b6d556ff2b4a5053e89fd084eb34e44cea14cFariborz Jahanian 981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump XM m0; 991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump XM m1 = m0; 1001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump m1.pr(); 101942f4f33d02dba823594bd2d7b3d317cb01c74f8Fariborz Jahanian} 1021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 103e9cbf15b2ebedebc8bb8e162bb5cf25abd70f578Anders Carlssonstruct A { 104e9cbf15b2ebedebc8bb8e162bb5cf25abd70f578Anders Carlsson}; 105e9cbf15b2ebedebc8bb8e162bb5cf25abd70f578Anders Carlsson 106e9cbf15b2ebedebc8bb8e162bb5cf25abd70f578Anders Carlssonstruct B : A { 107e9cbf15b2ebedebc8bb8e162bb5cf25abd70f578Anders Carlsson A &a; 108e9cbf15b2ebedebc8bb8e162bb5cf25abd70f578Anders Carlsson}; 109e9cbf15b2ebedebc8bb8e162bb5cf25abd70f578Anders Carlsson 110e9cbf15b2ebedebc8bb8e162bb5cf25abd70f578Anders Carlssonvoid f(const B &b1) { 111e9cbf15b2ebedebc8bb8e162bb5cf25abd70f578Anders Carlsson B b2(b1); 112e9cbf15b2ebedebc8bb8e162bb5cf25abd70f578Anders Carlsson} 11346bbf8d352fcd615420c5759a112ccd6e61516adAnders Carlsson 11446bbf8d352fcd615420c5759a112ccd6e61516adAnders Carlsson// PR6628 11546bbf8d352fcd615420c5759a112ccd6e61516adAnders Carlssonnamespace PR6628 { 11646bbf8d352fcd615420c5759a112ccd6e61516adAnders Carlsson 11746bbf8d352fcd615420c5759a112ccd6e61516adAnders Carlssonstruct T { 11846bbf8d352fcd615420c5759a112ccd6e61516adAnders Carlsson T(); 11946bbf8d352fcd615420c5759a112ccd6e61516adAnders Carlsson ~T(); 12046bbf8d352fcd615420c5759a112ccd6e61516adAnders Carlsson 12146bbf8d352fcd615420c5759a112ccd6e61516adAnders Carlsson double d; 12246bbf8d352fcd615420c5759a112ccd6e61516adAnders Carlsson}; 12346bbf8d352fcd615420c5759a112ccd6e61516adAnders Carlsson 12446bbf8d352fcd615420c5759a112ccd6e61516adAnders Carlssonstruct A { 12546bbf8d352fcd615420c5759a112ccd6e61516adAnders Carlsson A(const A &other, const T &t = T(), const T& t2 = T()); 12646bbf8d352fcd615420c5759a112ccd6e61516adAnders Carlsson}; 12746bbf8d352fcd615420c5759a112ccd6e61516adAnders Carlsson 12846bbf8d352fcd615420c5759a112ccd6e61516adAnders Carlssonstruct B : A { 12946bbf8d352fcd615420c5759a112ccd6e61516adAnders Carlsson A a1; 13046bbf8d352fcd615420c5759a112ccd6e61516adAnders Carlsson A a2; 1318887bdcd4056ac25cb37dcb2abb9514e668eb81aAnders Carlsson A a[10]; 13246bbf8d352fcd615420c5759a112ccd6e61516adAnders Carlsson}; 13346bbf8d352fcd615420c5759a112ccd6e61516adAnders Carlsson 13446bbf8d352fcd615420c5759a112ccd6e61516adAnders Carlsson// Force the copy constructor to be synthesized. 13546bbf8d352fcd615420c5759a112ccd6e61516adAnders Carlssonvoid f(B b1) { 13646bbf8d352fcd615420c5759a112ccd6e61516adAnders Carlsson B b2 = b1; 13746bbf8d352fcd615420c5759a112ccd6e61516adAnders Carlsson} 13846bbf8d352fcd615420c5759a112ccd6e61516adAnders Carlsson 139176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK: define linkonce_odr dereferenceable({{[0-9]+}}) [[A:%.*]]* @_ZN12rdar138169401AaSERKS0_( 1403ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK: [[THIS:%.*]] = load [[A]]*, [[A]]** 1413ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[A]], [[A]]* [[THIS]], i32 0, i32 1 1423ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK-NEXT: [[OTHER:%.*]] = load [[A]]*, [[A]]** 1433ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK-NEXT: [[T2:%.*]] = getelementptr inbounds [[A]], [[A]]* [[OTHER]], i32 0, i32 1 144651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-NEXT: [[T4:%.*]] = bitcast i16* [[T0]] to i8* 145651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-NEXT: [[T5:%.*]] = bitcast i16* [[T2]] to i8* 146402cd22c598b39a272f2b31b52b19d4830954e1aJohn McCall// CHECK-NEXT: call void @llvm.memcpy.p0i8.p0i8.i64(i8* [[T4]], i8* [[T5]], i64 8, i32 8, i1 false) 147402cd22c598b39a272f2b31b52b19d4830954e1aJohn McCall// CHECK-NEXT: ret [[A]]* [[THIS]] 148402cd22c598b39a272f2b31b52b19d4830954e1aJohn McCall 149176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK-LABEL: define linkonce_odr void @_ZN6PR66281BC2ERKS0_(%"struct.PR6628::B"* %this, %"struct.PR6628::B"* dereferenceable({{[0-9]+}})) unnamed_addr 15046bbf8d352fcd615420c5759a112ccd6e61516adAnders Carlsson// CHECK: call void @_ZN6PR66281TC1Ev 15146bbf8d352fcd615420c5759a112ccd6e61516adAnders Carlsson// CHECK: call void @_ZN6PR66281TC1Ev 15246bbf8d352fcd615420c5759a112ccd6e61516adAnders Carlsson// CHECK: call void @_ZN6PR66281AC2ERKS0_RKNS_1TES5_ 15346bbf8d352fcd615420c5759a112ccd6e61516adAnders Carlsson// CHECK: call void @_ZN6PR66281TD1Ev 15446bbf8d352fcd615420c5759a112ccd6e61516adAnders Carlsson// CHECK: call void @_ZN6PR66281TD1Ev 15546bbf8d352fcd615420c5759a112ccd6e61516adAnders Carlsson// CHECK: call void @_ZN6PR66281TC1Ev 15646bbf8d352fcd615420c5759a112ccd6e61516adAnders Carlsson// CHECK: call void @_ZN6PR66281TC1Ev 15746bbf8d352fcd615420c5759a112ccd6e61516adAnders Carlsson// CHECK: call void @_ZN6PR66281AC1ERKS0_RKNS_1TES5_ 15846bbf8d352fcd615420c5759a112ccd6e61516adAnders Carlsson// CHECK: call void @_ZN6PR66281TD1Ev 15946bbf8d352fcd615420c5759a112ccd6e61516adAnders Carlsson// CHECK: call void @_ZN6PR66281TD1Ev 16046bbf8d352fcd615420c5759a112ccd6e61516adAnders Carlsson// CHECK: call void @_ZN6PR66281TC1Ev 16146bbf8d352fcd615420c5759a112ccd6e61516adAnders Carlsson// CHECK: call void @_ZN6PR66281TC1Ev 16246bbf8d352fcd615420c5759a112ccd6e61516adAnders Carlsson// CHECK: call void @_ZN6PR66281AC1ERKS0_RKNS_1TES5_ 16346bbf8d352fcd615420c5759a112ccd6e61516adAnders Carlsson// CHECK: call void @_ZN6PR66281TD1Ev 16446bbf8d352fcd615420c5759a112ccd6e61516adAnders Carlsson// CHECK: call void @_ZN6PR66281TD1Ev 1650e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 1660e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK-LABEL: define linkonce_odr void @_ZN12rdar138169401AC2ERKS0_( 1673ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK: [[THIS:%.*]] = load [[A]]*, [[A]]** 1680e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK-NEXT: [[T0:%.*]] = bitcast [[A]]* [[THIS]] to i32 (...)*** 1693ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK-NEXT: store i32 (...)** bitcast (i8** getelementptr inbounds ([4 x i8*], [4 x i8*]* @_ZTVN12rdar138169401AE, i64 0, i64 2) to i32 (...)**), i32 (...)*** [[T0]] 1703ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[A]], [[A]]* [[THIS]], i32 0, i32 1 1713ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK-NEXT: [[OTHER:%.*]] = load [[A]]*, [[A]]** 1723ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK-NEXT: [[T2:%.*]] = getelementptr inbounds [[A]], [[A]]* [[OTHER]], i32 0, i32 1 1730e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK-NEXT: [[T4:%.*]] = bitcast i16* [[T0]] to i8* 1740e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK-NEXT: [[T5:%.*]] = bitcast i16* [[T2]] to i8* 1750e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK-NEXT: call void @llvm.memcpy.p0i8.p0i8.i64(i8* [[T4]], i8* [[T5]], i64 8, i32 8, i1 false) 1760e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK-NEXT: ret void 17746bbf8d352fcd615420c5759a112ccd6e61516adAnders Carlsson} 17846bbf8d352fcd615420c5759a112ccd6e61516adAnders Carlsson 179402cd22c598b39a272f2b31b52b19d4830954e1aJohn McCall// rdar://13816940 180402cd22c598b39a272f2b31b52b19d4830954e1aJohn McCall// Test above because things get weirdly re-ordered. 181402cd22c598b39a272f2b31b52b19d4830954e1aJohn McCallnamespace rdar13816940 { 182402cd22c598b39a272f2b31b52b19d4830954e1aJohn McCall struct A { 183402cd22c598b39a272f2b31b52b19d4830954e1aJohn McCall virtual ~A(); 184402cd22c598b39a272f2b31b52b19d4830954e1aJohn McCall unsigned short a : 1; 185402cd22c598b39a272f2b31b52b19d4830954e1aJohn McCall unsigned short : 15; 186402cd22c598b39a272f2b31b52b19d4830954e1aJohn McCall unsigned other; 187402cd22c598b39a272f2b31b52b19d4830954e1aJohn McCall }; 188402cd22c598b39a272f2b31b52b19d4830954e1aJohn McCall 189402cd22c598b39a272f2b31b52b19d4830954e1aJohn McCall void test(A &a) { 190402cd22c598b39a272f2b31b52b19d4830954e1aJohn McCall A x = a; // force copy constructor into existence 191402cd22c598b39a272f2b31b52b19d4830954e1aJohn McCall x = a; // also force the copy assignment operator 192402cd22c598b39a272f2b31b52b19d4830954e1aJohn McCall } 193402cd22c598b39a272f2b31b52b19d4830954e1aJohn McCall} 194