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