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 (...)***
1694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-NEXT: store i32 (...)** bitcast (i8** getelementptr inbounds ([4 x i8*], [4 x i8*]* @_ZTVN12rdar138169401AE, i32 0, i32 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