1762bb9d0ad20320b9f97a841dce57ba5e8e48b07Richard Smith// RUN: %clang_cc1 -std=c++11 -triple x86_64-apple-darwin10 %s -emit-llvm -o %t
2b681fb180dd1d1e8659006f1987711dcc92a6241Douglas Gregor// RUN: FileCheck %s < %t
3b681fb180dd1d1e8659006f1987711dcc92a6241Douglas Gregor// RUN: FileCheck -check-prefix=CHECK-PR10720 %s < %t
4742cd1b7bb86b52b23b335d47abbd842dac0e1bfFariborz Jahanian
5742cd1b7bb86b52b23b335d47abbd842dac0e1bfFariborz Jahanianextern "C" int printf(...);
6742cd1b7bb86b52b23b335d47abbd842dac0e1bfFariborz Jahanian
7742cd1b7bb86b52b23b335d47abbd842dac0e1bfFariborz Jahanianstruct M {
8742cd1b7bb86b52b23b335d47abbd842dac0e1bfFariborz Jahanian  M() { printf("M()\n"); }
9742cd1b7bb86b52b23b335d47abbd842dac0e1bfFariborz Jahanian  M(int i) { iM = i; printf("M(%d)\n", i); }
10742cd1b7bb86b52b23b335d47abbd842dac0e1bfFariborz Jahanian  int iM;
11742cd1b7bb86b52b23b335d47abbd842dac0e1bfFariborz Jahanian  void MPR() {printf("iM = %d\n", iM); };
12742cd1b7bb86b52b23b335d47abbd842dac0e1bfFariborz Jahanian};
13742cd1b7bb86b52b23b335d47abbd842dac0e1bfFariborz Jahanian
14742cd1b7bb86b52b23b335d47abbd842dac0e1bfFariborz Jahanianstruct P {
15742cd1b7bb86b52b23b335d47abbd842dac0e1bfFariborz Jahanian  P() { printf("P()\n"); }
16742cd1b7bb86b52b23b335d47abbd842dac0e1bfFariborz Jahanian  P(int i) { iP = i; printf("P(%d)\n", i); }
17742cd1b7bb86b52b23b335d47abbd842dac0e1bfFariborz Jahanian  int iP;
18742cd1b7bb86b52b23b335d47abbd842dac0e1bfFariborz Jahanian  void PPR() {printf("iP = %d\n", iP); };
19742cd1b7bb86b52b23b335d47abbd842dac0e1bfFariborz Jahanian};
20742cd1b7bb86b52b23b335d47abbd842dac0e1bfFariborz Jahanian
21742cd1b7bb86b52b23b335d47abbd842dac0e1bfFariborz Jahanianstruct Q {
22742cd1b7bb86b52b23b335d47abbd842dac0e1bfFariborz Jahanian  Q() { printf("Q()\n"); }
23742cd1b7bb86b52b23b335d47abbd842dac0e1bfFariborz Jahanian  Q(int i) { iQ = i; printf("Q(%d)\n", i); }
24742cd1b7bb86b52b23b335d47abbd842dac0e1bfFariborz Jahanian  int iQ;
25742cd1b7bb86b52b23b335d47abbd842dac0e1bfFariborz Jahanian  void QPR() {printf("iQ = %d\n", iQ); };
26742cd1b7bb86b52b23b335d47abbd842dac0e1bfFariborz Jahanian};
27742cd1b7bb86b52b23b335d47abbd842dac0e1bfFariborz Jahanian
28742cd1b7bb86b52b23b335d47abbd842dac0e1bfFariborz Jahanianstruct N : M , P, Q {
29742cd1b7bb86b52b23b335d47abbd842dac0e1bfFariborz Jahanian  N() : f1(1.314), P(2000), ld(00.1234+f1), M(1000), Q(3000),
30742cd1b7bb86b52b23b335d47abbd842dac0e1bfFariborz Jahanian        d1(3.4567), i1(1234), m1(100) { printf("N()\n"); }
31742cd1b7bb86b52b23b335d47abbd842dac0e1bfFariborz Jahanian  M m1;
32742cd1b7bb86b52b23b335d47abbd842dac0e1bfFariborz Jahanian  M m2;
33742cd1b7bb86b52b23b335d47abbd842dac0e1bfFariborz Jahanian  float f1;
34742cd1b7bb86b52b23b335d47abbd842dac0e1bfFariborz Jahanian  int i1;
35742cd1b7bb86b52b23b335d47abbd842dac0e1bfFariborz Jahanian  float d1;
361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  void PR() {
371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    printf("f1 = %f d1 = %f i1 = %d ld = %f \n", f1,d1,i1, ld);
381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    MPR();
391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    PPR();
401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    QPR();
411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    printf("iQ = %d\n", iQ);
421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    printf("iP = %d\n", iP);
431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    printf("iM = %d\n", iM);
441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    // FIXME. We don't yet support this syntax.
451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    // printf("iQ = %d\n", (*this).iQ);
461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    printf("iQ = %d\n", this->iQ);
471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    printf("iP = %d\n", this->iP);
481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    printf("iM = %d\n", this->iM);
491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
50742cd1b7bb86b52b23b335d47abbd842dac0e1bfFariborz Jahanian  float ld;
51742cd1b7bb86b52b23b335d47abbd842dac0e1bfFariborz Jahanian  float ff;
5264a54ad29929443006d4c8502173c163bedaa223Fariborz Jahanian  M arr_m[3];
5364a54ad29929443006d4c8502173c163bedaa223Fariborz Jahanian  P arr_p[1][3];
5464a54ad29929443006d4c8502173c163bedaa223Fariborz Jahanian  Q arr_q[2][3][4];
55742cd1b7bb86b52b23b335d47abbd842dac0e1bfFariborz Jahanian};
56742cd1b7bb86b52b23b335d47abbd842dac0e1bfFariborz Jahanian
57742cd1b7bb86b52b23b335d47abbd842dac0e1bfFariborz Jahanianint main() {
58742cd1b7bb86b52b23b335d47abbd842dac0e1bfFariborz Jahanian  M m1;
59742cd1b7bb86b52b23b335d47abbd842dac0e1bfFariborz Jahanian
60742cd1b7bb86b52b23b335d47abbd842dac0e1bfFariborz Jahanian  N n1;
61742cd1b7bb86b52b23b335d47abbd842dac0e1bfFariborz Jahanian  n1.PR();
62742cd1b7bb86b52b23b335d47abbd842dac0e1bfFariborz Jahanian}
63742cd1b7bb86b52b23b335d47abbd842dac0e1bfFariborz Jahanian
647abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor// PR5826
657abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregortemplate <class T> struct A {
667abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor  A() {}
677abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor  A(int) {}
687abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor  A(const A&) {}
697abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor  ~A() {}
707abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor  operator int() {return 0;}
717abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor};
727abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor
7393ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @_Z1fv()
747abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregorvoid f() {
757abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor  // CHECK: call void @_ZN1AIsEC1Ei
767abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor  A<short> a4 = 97;
777abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor
787abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor  // CHECK-NEXT: store i32 17
797abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor  int i = 17;
807abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor
817abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor  // CHECK-NEXT: call void @_ZN1AIsED1Ev
827abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor  // CHECK-NOT: call void @_ZN1AIsED1Ev
837abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor  // CHECK: ret void
847abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor}
85d6068482648a366ac9fc297a84780e922ab63a7aDouglas Gregor
867e1dff7a68a4d00e71debafa7f5c259473091746John McCall// Make sure we initialize the vtable pointer if it's required by a
877e1dff7a68a4d00e71debafa7f5c259473091746John McCall// base initializer.
887e1dff7a68a4d00e71debafa7f5c259473091746John McCallnamespace InitVTable {
897e1dff7a68a4d00e71debafa7f5c259473091746John McCall  struct A { A(int); };
907e1dff7a68a4d00e71debafa7f5c259473091746John McCall  struct B : A {
917e1dff7a68a4d00e71debafa7f5c259473091746John McCall    virtual int foo();
927e1dff7a68a4d00e71debafa7f5c259473091746John McCall    B();
937e1dff7a68a4d00e71debafa7f5c259473091746John McCall    B(int);
947e1dff7a68a4d00e71debafa7f5c259473091746John McCall  };
957e1dff7a68a4d00e71debafa7f5c259473091746John McCall
9693ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define void @_ZN10InitVTable1BC2Ev(%"struct.InitVTable::B"* %this) unnamed_addr
970e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  // CHECK:      [[T0:%.*]] = bitcast [[B:%.*]]* [[THIS:%.*]] to i32 (...)***
984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // CHECK-NEXT: store i32 (...)** bitcast (i8** getelementptr inbounds ([3 x i8*], [3 x i8*]* @_ZTVN10InitVTable1BE, i32 0, i32 2) to i32 (...)**), i32 (...)*** [[T0]]
993ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECK:      [[VTBL:%.*]] = load i32 ([[B]]*)**, i32 ([[B]]*)*** {{%.*}}
1003ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECK-NEXT: [[FNP:%.*]] = getelementptr inbounds i32 ([[B]]*)*, i32 ([[B]]*)** [[VTBL]], i64 0
1013ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECK-NEXT: [[FN:%.*]] = load i32 ([[B]]*)*, i32 ([[B]]*)** [[FNP]]
1027e1dff7a68a4d00e71debafa7f5c259473091746John McCall  // CHECK-NEXT: [[ARG:%.*]] = call i32 [[FN]]([[B]]* [[THIS]])
103a83c6be907b2a6b9ccc979c79b3a24a7e48b2c54John McCall  // CHECK-NEXT: call void @_ZN10InitVTable1AC2Ei({{.*}}* {{%.*}}, i32 [[ARG]])
1040e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  // CHECK-NEXT: [[T0:%.*]] = bitcast [[B]]* [[THIS]] to i32 (...)***
1054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // CHECK-NEXT: store i32 (...)** bitcast (i8** getelementptr inbounds ([3 x i8*], [3 x i8*]* @_ZTVN10InitVTable1BE, i32 0, i32 2) to i32 (...)**), i32 (...)*** [[T0]]
1067e1dff7a68a4d00e71debafa7f5c259473091746John McCall  // CHECK-NEXT: ret void
1077e1dff7a68a4d00e71debafa7f5c259473091746John McCall  B::B() : A(foo()) {}
1087e1dff7a68a4d00e71debafa7f5c259473091746John McCall
10993ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define void @_ZN10InitVTable1BC2Ei(%"struct.InitVTable::B"* %this, i32 %x) unnamed_addr
1107e1dff7a68a4d00e71debafa7f5c259473091746John McCall  // CHECK:      [[ARG:%.*]] = add nsw i32 {{%.*}}, 5
1117e1dff7a68a4d00e71debafa7f5c259473091746John McCall  // CHECK-NEXT: call void @_ZN10InitVTable1AC2Ei({{.*}}* {{%.*}}, i32 [[ARG]])
1120e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  // CHECK-NEXT: [[T0:%.*]] = bitcast [[B]]* {{%.*}} to i32 (...)***
1134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // CHECK-NEXT: store i32 (...)** bitcast (i8** getelementptr inbounds ([3 x i8*], [3 x i8*]* @_ZTVN10InitVTable1BE, i32 0, i32 2) to i32 (...)**), i32 (...)*** [[T0]]
1147e1dff7a68a4d00e71debafa7f5c259473091746John McCall  // CHECK-NEXT: ret void
1157e1dff7a68a4d00e71debafa7f5c259473091746John McCall  B::B(int x) : A(x + 5) {}
1167e1dff7a68a4d00e71debafa7f5c259473091746John McCall}
1177e1dff7a68a4d00e71debafa7f5c259473091746John McCall
118df9a41f3c1d1ca5aec6e2c17e38c29cff72b8726Douglas Gregornamespace rdar9694300 {
119df9a41f3c1d1ca5aec6e2c17e38c29cff72b8726Douglas Gregor  struct X {
120df9a41f3c1d1ca5aec6e2c17e38c29cff72b8726Douglas Gregor    int x;
121df9a41f3c1d1ca5aec6e2c17e38c29cff72b8726Douglas Gregor  };
122df9a41f3c1d1ca5aec6e2c17e38c29cff72b8726Douglas Gregor
12393ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define void @_ZN11rdar96943001fEv
124df9a41f3c1d1ca5aec6e2c17e38c29cff72b8726Douglas Gregor  void f() {
125df9a41f3c1d1ca5aec6e2c17e38c29cff72b8726Douglas Gregor    // CHECK: alloca
126df9a41f3c1d1ca5aec6e2c17e38c29cff72b8726Douglas Gregor    X x;
127df9a41f3c1d1ca5aec6e2c17e38c29cff72b8726Douglas Gregor    // CHECK-NEXT: [[I:%.*]] = alloca i32
128df9a41f3c1d1ca5aec6e2c17e38c29cff72b8726Douglas Gregor    // CHECK-NEXT: store i32 17, i32* [[I]]
129df9a41f3c1d1ca5aec6e2c17e38c29cff72b8726Douglas Gregor    int i = 17;
130df9a41f3c1d1ca5aec6e2c17e38c29cff72b8726Douglas Gregor    // CHECK-NEXT: ret void
131df9a41f3c1d1ca5aec6e2c17e38c29cff72b8726Douglas Gregor  }
132df9a41f3c1d1ca5aec6e2c17e38c29cff72b8726Douglas Gregor}
133df9a41f3c1d1ca5aec6e2c17e38c29cff72b8726Douglas Gregor
134f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith// Check that we emit a zero initialization step for list-value-initialization
135f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith// which calls a trivial default constructor.
136f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smithnamespace PR13273 {
137f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith  struct U {
138f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith    int t;
139f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith    U() = default;
140f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith  };
141f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith
142f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith  struct S : U {
143f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith    S() = default;
144f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith  };
145f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith
146f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith  // CHECK: define {{.*}}@_ZN7PR132731fEv(
147f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith  int f() {
148f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith    // CHECK-NOT: }
149f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith    // CHECK: llvm.memset{{.*}}i8 0
150f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith    return (new S{})->t;
151f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith  }
152f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith}
153f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith
154d6068482648a366ac9fc297a84780e922ab63a7aDouglas Gregortemplate<typename T>
155d6068482648a366ac9fc297a84780e922ab63a7aDouglas Gregorstruct X {
156d6068482648a366ac9fc297a84780e922ab63a7aDouglas Gregor  X(const X &);
157d6068482648a366ac9fc297a84780e922ab63a7aDouglas Gregor
158d6068482648a366ac9fc297a84780e922ab63a7aDouglas Gregor  T *start;
159d6068482648a366ac9fc297a84780e922ab63a7aDouglas Gregor  T *end;
160d6068482648a366ac9fc297a84780e922ab63a7aDouglas Gregor};
161d6068482648a366ac9fc297a84780e922ab63a7aDouglas Gregor
162d6068482648a366ac9fc297a84780e922ab63a7aDouglas Gregortemplate<typename T> struct X;
163d6068482648a366ac9fc297a84780e922ab63a7aDouglas Gregor
164d6068482648a366ac9fc297a84780e922ab63a7aDouglas Gregor// Make sure that the instantiated constructor initializes start and
165d6068482648a366ac9fc297a84780e922ab63a7aDouglas Gregor// end properly.
166176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK-LABEL: define linkonce_odr void @_ZN1XIiEC2ERKS0_(%struct.X* %this, %struct.X* dereferenceable({{[0-9]+}}) %other) unnamed_addr
167d6068482648a366ac9fc297a84780e922ab63a7aDouglas Gregor// CHECK: {{store.*null}}
168d6068482648a366ac9fc297a84780e922ab63a7aDouglas Gregor// CHECK: {{store.*null}}
169d6068482648a366ac9fc297a84780e922ab63a7aDouglas Gregor// CHECK: ret
170d6068482648a366ac9fc297a84780e922ab63a7aDouglas Gregortemplate<typename T>
171d6068482648a366ac9fc297a84780e922ab63a7aDouglas GregorX<T>::X(const X &other) : start(0), end(0) { }
172d6068482648a366ac9fc297a84780e922ab63a7aDouglas Gregor
173d6068482648a366ac9fc297a84780e922ab63a7aDouglas GregorX<int> get_X(X<int> x) { return x; }
174b681fb180dd1d1e8659006f1987711dcc92a6241Douglas Gregor
175b681fb180dd1d1e8659006f1987711dcc92a6241Douglas Gregornamespace PR10720 {
176b681fb180dd1d1e8659006f1987711dcc92a6241Douglas Gregor  struct X {
177b681fb180dd1d1e8659006f1987711dcc92a6241Douglas Gregor    X(const X&);
178b681fb180dd1d1e8659006f1987711dcc92a6241Douglas Gregor    X(X&&);
179b681fb180dd1d1e8659006f1987711dcc92a6241Douglas Gregor    X& operator=(const X&);
180b681fb180dd1d1e8659006f1987711dcc92a6241Douglas Gregor    X& operator=(X&&);
181b681fb180dd1d1e8659006f1987711dcc92a6241Douglas Gregor    ~X();
182b681fb180dd1d1e8659006f1987711dcc92a6241Douglas Gregor  };
183b681fb180dd1d1e8659006f1987711dcc92a6241Douglas Gregor
184b681fb180dd1d1e8659006f1987711dcc92a6241Douglas Gregor  struct pair2 {
185b681fb180dd1d1e8659006f1987711dcc92a6241Douglas Gregor    X second[4];
186b681fb180dd1d1e8659006f1987711dcc92a6241Douglas Gregor
187b681fb180dd1d1e8659006f1987711dcc92a6241Douglas Gregor    // CHECK-PR10720: define linkonce_odr {{.*}} @_ZN7PR107205pair2aSERKS0_
188b681fb180dd1d1e8659006f1987711dcc92a6241Douglas Gregor    // CHECK-PR10720: load
189b681fb180dd1d1e8659006f1987711dcc92a6241Douglas Gregor    // CHECK-PR10720: icmp ne
190b681fb180dd1d1e8659006f1987711dcc92a6241Douglas Gregor    // CHECK-PR10720-NEXT: br i1
191b681fb180dd1d1e8659006f1987711dcc92a6241Douglas Gregor    // CHECK-PR10720: call {{.*}} @_ZN7PR107201XaSERKS0_
192b681fb180dd1d1e8659006f1987711dcc92a6241Douglas Gregor    // CHECK-PR10720: ret
193b681fb180dd1d1e8659006f1987711dcc92a6241Douglas Gregor    pair2 &operator=(const pair2&) = default;
194b681fb180dd1d1e8659006f1987711dcc92a6241Douglas Gregor
195b681fb180dd1d1e8659006f1987711dcc92a6241Douglas Gregor    // CHECK-PR10720: define linkonce_odr {{.*}} @_ZN7PR107205pair2aSEOS0_
196b681fb180dd1d1e8659006f1987711dcc92a6241Douglas Gregor    // CHECK-PR10720: load
197b681fb180dd1d1e8659006f1987711dcc92a6241Douglas Gregor    // CHECK-PR10720: icmp ne
198b681fb180dd1d1e8659006f1987711dcc92a6241Douglas Gregor    // CHECK-PR10720-NEXT: br i1
199b681fb180dd1d1e8659006f1987711dcc92a6241Douglas Gregor    // CHECK-PR10720: call {{.*}} @_ZN7PR107201XaSEOS0_
200b681fb180dd1d1e8659006f1987711dcc92a6241Douglas Gregor    // CHECK-PR10720: ret
201b681fb180dd1d1e8659006f1987711dcc92a6241Douglas Gregor    pair2 &operator=(pair2&&) = default;
202b681fb180dd1d1e8659006f1987711dcc92a6241Douglas Gregor
2030e2c34f92f00628d48968dfea096d36381f494cbStephen Hines    // CHECK-PR10720-LABEL: define linkonce_odr void @_ZN7PR107204pairC2ERKS0_
2040e2c34f92f00628d48968dfea096d36381f494cbStephen Hines    // CHECK-PR10720-NOT: ret
2050e2c34f92f00628d48968dfea096d36381f494cbStephen Hines    // CHECK-PR10720: call void @llvm.memcpy
2060e2c34f92f00628d48968dfea096d36381f494cbStephen Hines    // CHECK-PR10720-NEXT: ret void
2070e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
2080e2c34f92f00628d48968dfea096d36381f494cbStephen Hines    // CHECK-PR10720-LABEL: define linkonce_odr void @_ZN7PR107205pair2C2ERKS0_
209b681fb180dd1d1e8659006f1987711dcc92a6241Douglas Gregor    // CHECK-PR10720-NOT: ret
210b681fb180dd1d1e8659006f1987711dcc92a6241Douglas Gregor    // CHECK-PR10720: load
211b681fb180dd1d1e8659006f1987711dcc92a6241Douglas Gregor    // CHECK-PR10720: icmp ult
212b681fb180dd1d1e8659006f1987711dcc92a6241Douglas Gregor    // CHECK-PR10720-NEXT: br i1
2130e2c34f92f00628d48968dfea096d36381f494cbStephen Hines    // CHECK-PR10720: call void @_ZN7PR107201XC1ERKS0_
214b681fb180dd1d1e8659006f1987711dcc92a6241Douglas Gregor    // CHECK-PR10720-NEXT: br label
215b681fb180dd1d1e8659006f1987711dcc92a6241Douglas Gregor    // CHECK-PR10720: ret void
216b681fb180dd1d1e8659006f1987711dcc92a6241Douglas Gregor
2170e2c34f92f00628d48968dfea096d36381f494cbStephen Hines    // CHECK-PR10720-LABEL: define linkonce_odr void @_ZN7PR107205pair2C2EOS0_
218b681fb180dd1d1e8659006f1987711dcc92a6241Douglas Gregor    // CHECK-PR10720-NOT: ret
219b681fb180dd1d1e8659006f1987711dcc92a6241Douglas Gregor    // CHECK-PR10720: load
220b681fb180dd1d1e8659006f1987711dcc92a6241Douglas Gregor    // CHECK-PR10720: icmp ult
221b681fb180dd1d1e8659006f1987711dcc92a6241Douglas Gregor    // CHECK-PR10720-NEXT: br i1
2220e2c34f92f00628d48968dfea096d36381f494cbStephen Hines    // CHECK-PR10720: call void @_ZN7PR107201XC1EOS0_
223b681fb180dd1d1e8659006f1987711dcc92a6241Douglas Gregor    // CHECK-PR10720-NEXT: br label
224b681fb180dd1d1e8659006f1987711dcc92a6241Douglas Gregor    // CHECK-PR10720: ret void
2250e2c34f92f00628d48968dfea096d36381f494cbStephen Hines    pair2(pair2&&) = default;
2260e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
227b681fb180dd1d1e8659006f1987711dcc92a6241Douglas Gregor    pair2(const pair2&) = default;
228b681fb180dd1d1e8659006f1987711dcc92a6241Douglas Gregor  };
229b681fb180dd1d1e8659006f1987711dcc92a6241Douglas Gregor
230e653ba2f3b6d993b5d410554c12416c03ec7775bRichard Smith  struct pair : X { // Make the copy constructor non-trivial, so we actually generate it.
231b681fb180dd1d1e8659006f1987711dcc92a6241Douglas Gregor    int second[4];
232b681fb180dd1d1e8659006f1987711dcc92a6241Douglas Gregor    pair(const pair&) = default;
233b681fb180dd1d1e8659006f1987711dcc92a6241Douglas Gregor  };
234b681fb180dd1d1e8659006f1987711dcc92a6241Douglas Gregor
235b681fb180dd1d1e8659006f1987711dcc92a6241Douglas Gregor  void foo(const pair &x, const pair2 &x2) {
236b681fb180dd1d1e8659006f1987711dcc92a6241Douglas Gregor    pair y(x);
237b681fb180dd1d1e8659006f1987711dcc92a6241Douglas Gregor    pair2 y2(x2);
238b681fb180dd1d1e8659006f1987711dcc92a6241Douglas Gregor    pair2 y2m(static_cast<pair2&&>(y2));
239b681fb180dd1d1e8659006f1987711dcc92a6241Douglas Gregor
240b681fb180dd1d1e8659006f1987711dcc92a6241Douglas Gregor    y2 = x2;
241b681fb180dd1d1e8659006f1987711dcc92a6241Douglas Gregor    y2m = static_cast<pair2&&>(y2);
242b681fb180dd1d1e8659006f1987711dcc92a6241Douglas Gregor  }
243b681fb180dd1d1e8659006f1987711dcc92a6241Douglas Gregor
244b681fb180dd1d1e8659006f1987711dcc92a6241Douglas Gregor}
245