1*f4a2713aSLionel Sambuc // RUN: %clang_cc1 -triple x86_64-apple-darwin10 -emit-llvm -std=c++03 -fexceptions -fcxx-exceptions -o - %s | FileCheck %s 2*f4a2713aSLionel Sambuc // RUN: %clang_cc1 -triple i386-apple-darwin10 -emit-llvm -std=c++03 -o - %s | FileCheck --check-prefix=CHECK-2 %s 3*f4a2713aSLionel Sambuc 4*f4a2713aSLionel Sambuc struct POD { 5*f4a2713aSLionel Sambuc int w, x, y, z; 6*f4a2713aSLionel Sambuc }; 7*f4a2713aSLionel Sambuc 8*f4a2713aSLionel Sambuc struct PODLike { 9*f4a2713aSLionel Sambuc int w, x, y, z; 10*f4a2713aSLionel Sambuc PODLike(); 11*f4a2713aSLionel Sambuc ~PODLike(); 12*f4a2713aSLionel Sambuc }; 13*f4a2713aSLionel Sambuc 14*f4a2713aSLionel Sambuc struct NonPOD { 15*f4a2713aSLionel Sambuc NonPOD(); 16*f4a2713aSLionel Sambuc NonPOD(const NonPOD&); 17*f4a2713aSLionel Sambuc NonPOD& operator=(const NonPOD&); 18*f4a2713aSLionel Sambuc }; 19*f4a2713aSLionel Sambuc 20*f4a2713aSLionel Sambuc struct Basic { 21*f4a2713aSLionel Sambuc int a, b, c, d; 22*f4a2713aSLionel Sambuc NonPOD np; 23*f4a2713aSLionel Sambuc int w, x, y, z; 24*f4a2713aSLionel Sambuc }; 25*f4a2713aSLionel Sambuc 26*f4a2713aSLionel Sambuc struct PODMember { 27*f4a2713aSLionel Sambuc int a, b, c, d; 28*f4a2713aSLionel Sambuc POD p; 29*f4a2713aSLionel Sambuc NonPOD np; 30*f4a2713aSLionel Sambuc int w, x, y, z; 31*f4a2713aSLionel Sambuc }; 32*f4a2713aSLionel Sambuc 33*f4a2713aSLionel Sambuc struct PODLikeMember { 34*f4a2713aSLionel Sambuc int a, b, c, d; 35*f4a2713aSLionel Sambuc PODLike pl; 36*f4a2713aSLionel Sambuc NonPOD np; 37*f4a2713aSLionel Sambuc int w, x, y, z; 38*f4a2713aSLionel Sambuc }; 39*f4a2713aSLionel Sambuc 40*f4a2713aSLionel Sambuc struct ArrayMember { 41*f4a2713aSLionel Sambuc int a, b, c, d; 42*f4a2713aSLionel Sambuc int e[12]; 43*f4a2713aSLionel Sambuc NonPOD np; 44*f4a2713aSLionel Sambuc int f[12]; 45*f4a2713aSLionel Sambuc int w, x, y, z; 46*f4a2713aSLionel Sambuc }; 47*f4a2713aSLionel Sambuc 48*f4a2713aSLionel Sambuc struct VolatileMember { 49*f4a2713aSLionel Sambuc int a, b, c, d; 50*f4a2713aSLionel Sambuc volatile int v; 51*f4a2713aSLionel Sambuc NonPOD np; 52*f4a2713aSLionel Sambuc int w, x, y, z; 53*f4a2713aSLionel Sambuc }; 54*f4a2713aSLionel Sambuc 55*f4a2713aSLionel Sambuc struct BitfieldMember { 56*f4a2713aSLionel Sambuc int a, b, c, d; 57*f4a2713aSLionel Sambuc NonPOD np; 58*f4a2713aSLionel Sambuc int w : 6; 59*f4a2713aSLionel Sambuc int x : 6; 60*f4a2713aSLionel Sambuc int y : 6; 61*f4a2713aSLionel Sambuc int z : 6; 62*f4a2713aSLionel Sambuc }; 63*f4a2713aSLionel Sambuc 64*f4a2713aSLionel Sambuc struct BitfieldMember2 { 65*f4a2713aSLionel Sambuc unsigned a : 1; 66*f4a2713aSLionel Sambuc unsigned b, c, d; 67*f4a2713aSLionel Sambuc NonPOD np; 68*f4a2713aSLionel Sambuc }; 69*f4a2713aSLionel Sambuc 70*f4a2713aSLionel Sambuc struct InnerClassMember { 71*f4a2713aSLionel Sambuc struct { 72*f4a2713aSLionel Sambuc int a, b, c, d; 73*f4a2713aSLionel Sambuc } a; 74*f4a2713aSLionel Sambuc int b, c, d, e; 75*f4a2713aSLionel Sambuc NonPOD np; 76*f4a2713aSLionel Sambuc int w, x, y, z; 77*f4a2713aSLionel Sambuc }; 78*f4a2713aSLionel Sambuc 79*f4a2713aSLionel Sambuc struct ReferenceMember { 80*f4a2713aSLionel Sambuc ReferenceMember(int &a, int &b, int &c, int &d) 81*f4a2713aSLionel Sambuc : a(a), b(b), c(c), d(d) {} 82*f4a2713aSLionel Sambuc int &a; 83*f4a2713aSLionel Sambuc int &b; 84*f4a2713aSLionel Sambuc NonPOD np; 85*f4a2713aSLionel Sambuc int &c; 86*f4a2713aSLionel Sambuc int &d; 87*f4a2713aSLionel Sambuc }; 88*f4a2713aSLionel Sambuc 89*f4a2713aSLionel Sambuc struct __attribute__((packed)) PackedMembers { 90*f4a2713aSLionel Sambuc char c; 91*f4a2713aSLionel Sambuc NonPOD np; 92*f4a2713aSLionel Sambuc int w, x, y, z; 93*f4a2713aSLionel Sambuc }; 94*f4a2713aSLionel Sambuc 95*f4a2713aSLionel Sambuc // COPY-ASSIGNMENT OPERATORS: 96*f4a2713aSLionel Sambuc 97*f4a2713aSLionel Sambuc // Assignment operators are output in the order they're encountered. 98*f4a2713aSLionel Sambuc 99*f4a2713aSLionel Sambuc #define CALL_AO(T) void callAO##T(T& a, const T& b) { a = b; } 100*f4a2713aSLionel Sambuc 101*f4a2713aSLionel Sambuc CALL_AO(Basic) 102*f4a2713aSLionel Sambuc CALL_AO(PODMember) 103*f4a2713aSLionel Sambuc CALL_AO(PODLikeMember) 104*f4a2713aSLionel Sambuc CALL_AO(ArrayMember) 105*f4a2713aSLionel Sambuc CALL_AO(VolatileMember) 106*f4a2713aSLionel Sambuc CALL_AO(BitfieldMember) 107*f4a2713aSLionel Sambuc CALL_AO(InnerClassMember) 108*f4a2713aSLionel Sambuc CALL_AO(PackedMembers) 109*f4a2713aSLionel Sambuc 110*f4a2713aSLionel Sambuc // Basic copy-assignment: 111*f4a2713aSLionel Sambuc // CHECK-LABEL: define linkonce_odr %struct.Basic* @_ZN5BasicaSERKS_(%struct.Basic* %this, %struct.Basic*) 112*f4a2713aSLionel Sambuc // CHECK: call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}i64 16, i32 4{{.*}}) 113*f4a2713aSLionel Sambuc // CHECK: call %struct.NonPOD* @_ZN6NonPODaSERKS_ 114*f4a2713aSLionel Sambuc // CHECK: call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}i64 16, i32 4{{.*}}) 115*f4a2713aSLionel Sambuc // CHECK: ret %struct.Basic* 116*f4a2713aSLionel Sambuc 117*f4a2713aSLionel Sambuc // PODMember copy-assignment: 118*f4a2713aSLionel Sambuc // CHECK-LABEL: define linkonce_odr %struct.PODMember* @_ZN9PODMemberaSERKS_(%struct.PODMember* %this, %struct.PODMember*) 119*f4a2713aSLionel Sambuc // CHECK: call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}i64 32, i32 4{{.*}}) 120*f4a2713aSLionel Sambuc // CHECK: call %struct.NonPOD* @_ZN6NonPODaSERKS_ 121*f4a2713aSLionel Sambuc // CHECK: call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}i64 16, i32 4{{.*}}) 122*f4a2713aSLionel Sambuc // CHECK: ret %struct.PODMember* 123*f4a2713aSLionel Sambuc 124*f4a2713aSLionel Sambuc // PODLikeMember copy-assignment: 125*f4a2713aSLionel Sambuc // CHECK-LABEL: define linkonce_odr %struct.PODLikeMember* @_ZN13PODLikeMemberaSERKS_(%struct.PODLikeMember* %this, %struct.PODLikeMember*) 126*f4a2713aSLionel Sambuc // CHECK: call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}i64 32, i32 4{{.*}}) 127*f4a2713aSLionel Sambuc // CHECK: call %struct.NonPOD* @_ZN6NonPODaSERKS_ 128*f4a2713aSLionel Sambuc // CHECK: call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}i64 16, i32 4{{.*}}) 129*f4a2713aSLionel Sambuc // CHECK: ret %struct.PODLikeMember* 130*f4a2713aSLionel Sambuc 131*f4a2713aSLionel Sambuc // ArrayMember copy-assignment: 132*f4a2713aSLionel Sambuc // CHECK-LABEL: define linkonce_odr %struct.ArrayMember* @_ZN11ArrayMemberaSERKS_(%struct.ArrayMember* %this, %struct.ArrayMember*) 133*f4a2713aSLionel Sambuc // CHECK: call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}i64 64, i32 4{{.*}}) 134*f4a2713aSLionel Sambuc // CHECK: call %struct.NonPOD* @_ZN6NonPODaSERKS_ 135*f4a2713aSLionel Sambuc // CHECK: call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}i64 64, i32 4{{.*}}) 136*f4a2713aSLionel Sambuc // CHECK: ret %struct.ArrayMember* 137*f4a2713aSLionel Sambuc 138*f4a2713aSLionel Sambuc // VolatileMember copy-assignment: 139*f4a2713aSLionel Sambuc // CHECK-LABEL: define linkonce_odr %struct.VolatileMember* @_ZN14VolatileMemberaSERKS_(%struct.VolatileMember* %this, %struct.VolatileMember*) 140*f4a2713aSLionel Sambuc // CHECK: call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}i64 16, i32 4{{.*}}) 141*f4a2713aSLionel Sambuc // CHECK: load volatile i32* {{.*}}, align 4 142*f4a2713aSLionel Sambuc // CHECK: store volatile i32 {{.*}}, align 4 143*f4a2713aSLionel Sambuc // CHECK: call %struct.NonPOD* @_ZN6NonPODaSERKS_ 144*f4a2713aSLionel Sambuc // CHECK: call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}i64 16, i32 4{{.*}}) 145*f4a2713aSLionel Sambuc // CHECK: ret %struct.VolatileMember* 146*f4a2713aSLionel Sambuc 147*f4a2713aSLionel Sambuc // BitfieldMember copy-assignment: 148*f4a2713aSLionel Sambuc // CHECK-LABEL: define linkonce_odr %struct.BitfieldMember* @_ZN14BitfieldMemberaSERKS_(%struct.BitfieldMember* %this, %struct.BitfieldMember*) 149*f4a2713aSLionel Sambuc // CHECK: call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}i64 16, i32 4{{.*}}) 150*f4a2713aSLionel Sambuc // CHECK: call %struct.NonPOD* @_ZN6NonPODaSERKS_ 151*f4a2713aSLionel Sambuc // CHECK: call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}i64 3, i32 1{{.*}}) 152*f4a2713aSLionel Sambuc // CHECK: ret %struct.BitfieldMember* 153*f4a2713aSLionel Sambuc 154*f4a2713aSLionel Sambuc // InnerClass copy-assignment: 155*f4a2713aSLionel Sambuc // CHECK-LABEL: define linkonce_odr %struct.InnerClassMember* @_ZN16InnerClassMemberaSERKS_(%struct.InnerClassMember* %this, %struct.InnerClassMember*) 156*f4a2713aSLionel Sambuc // CHECK: call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}i64 32, i32 4{{.*}}) 157*f4a2713aSLionel Sambuc // CHECK: call %struct.NonPOD* @_ZN6NonPODaSERKS_ 158*f4a2713aSLionel Sambuc // CHECK: call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}i64 16, i32 4{{.*}}) 159*f4a2713aSLionel Sambuc // CHECK: ret %struct.InnerClassMember* 160*f4a2713aSLionel Sambuc 161*f4a2713aSLionel Sambuc // PackedMembers copy-assignment: 162*f4a2713aSLionel Sambuc // CHECK-LABEL: define linkonce_odr %struct.PackedMembers* @_ZN13PackedMembersaSERKS_(%struct.PackedMembers* %this, %struct.PackedMembers*) 163*f4a2713aSLionel Sambuc // CHECK: call %struct.NonPOD* @_ZN6NonPODaSERKS_ 164*f4a2713aSLionel Sambuc // CHECK: call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}i64 16, i32 1{{.*}}) 165*f4a2713aSLionel Sambuc // CHECK: ret %struct.PackedMembers* 166*f4a2713aSLionel Sambuc 167*f4a2713aSLionel Sambuc // COPY-CONSTRUCTORS: 168*f4a2713aSLionel Sambuc 169*f4a2713aSLionel Sambuc // Clang outputs copy-constructors in the reverse of the order that 170*f4a2713aSLionel Sambuc // copy-constructor calls are encountered. Add functions that call the copy 171*f4a2713aSLionel Sambuc // constructors of the classes above in reverse order here. 172*f4a2713aSLionel Sambuc 173*f4a2713aSLionel Sambuc #define CALL_CC(T) T callCC##T(const T& b) { return b; } 174*f4a2713aSLionel Sambuc 175*f4a2713aSLionel Sambuc CALL_CC(PackedMembers) 176*f4a2713aSLionel Sambuc CALL_CC(BitfieldMember2) 177*f4a2713aSLionel Sambuc CALL_CC(ReferenceMember) 178*f4a2713aSLionel Sambuc CALL_CC(InnerClassMember) 179*f4a2713aSLionel Sambuc CALL_CC(BitfieldMember) 180*f4a2713aSLionel Sambuc CALL_CC(VolatileMember) 181*f4a2713aSLionel Sambuc CALL_CC(ArrayMember) 182*f4a2713aSLionel Sambuc CALL_CC(PODLikeMember) 183*f4a2713aSLionel Sambuc CALL_CC(PODMember) 184*f4a2713aSLionel Sambuc CALL_CC(Basic) 185*f4a2713aSLionel Sambuc 186*f4a2713aSLionel Sambuc // Basic copy-constructor: 187*f4a2713aSLionel Sambuc // CHECK-LABEL: define linkonce_odr void @_ZN5BasicC2ERKS_(%struct.Basic* %this, %struct.Basic*) 188*f4a2713aSLionel Sambuc // CHECK: call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}i64 16, i32 4{{.*}}) 189*f4a2713aSLionel Sambuc // CHECK: call void @_ZN6NonPODC1ERKS_ 190*f4a2713aSLionel Sambuc // CHECK: call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}i64 16, i32 4{{.*}}) 191*f4a2713aSLionel Sambuc // CHECK: ret void 192*f4a2713aSLionel Sambuc 193*f4a2713aSLionel Sambuc // PODMember copy-constructor: 194*f4a2713aSLionel Sambuc // CHECK-LABEL: define linkonce_odr void @_ZN9PODMemberC2ERKS_(%struct.PODMember* %this, %struct.PODMember*) 195*f4a2713aSLionel Sambuc // CHECK: call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}i64 32, i32 4{{.*}}) 196*f4a2713aSLionel Sambuc // CHECK: call void @_ZN6NonPODC1ERKS_ 197*f4a2713aSLionel Sambuc // CHECK: call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}i64 16, i32 4{{.*}}) 198*f4a2713aSLionel Sambuc // CHECK: ret void 199*f4a2713aSLionel Sambuc 200*f4a2713aSLionel Sambuc // PODLikeMember copy-constructor: 201*f4a2713aSLionel Sambuc // CHECK-LABEL: define linkonce_odr void @_ZN13PODLikeMemberC2ERKS_(%struct.PODLikeMember* %this, %struct.PODLikeMember*) 202*f4a2713aSLionel Sambuc // CHECK: call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}i64 32, i32 4{{.*}}) 203*f4a2713aSLionel Sambuc // CHECK: invoke void @_ZN6NonPODC1ERKS_ 204*f4a2713aSLionel Sambuc // CHECK: call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}i64 16, i32 4{{.*}}) 205*f4a2713aSLionel Sambuc // CHECK: ret void 206*f4a2713aSLionel Sambuc // CHECK: landingpad 207*f4a2713aSLionel Sambuc // CHECK: invoke void @_ZN7PODLikeD1Ev 208*f4a2713aSLionel Sambuc 209*f4a2713aSLionel Sambuc // ArrayMember copy-constructor: 210*f4a2713aSLionel Sambuc // CHECK-LABEL: define linkonce_odr void @_ZN11ArrayMemberC2ERKS_(%struct.ArrayMember* %this, %struct.ArrayMember*) 211*f4a2713aSLionel Sambuc // CHECK: call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}i64 64, i32 4{{.*}}) 212*f4a2713aSLionel Sambuc // CHECK: call void @_ZN6NonPODC1ERKS_ 213*f4a2713aSLionel Sambuc // CHECK: call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}i64 64, i32 4{{.*}}) 214*f4a2713aSLionel Sambuc // CHECK: ret void 215*f4a2713aSLionel Sambuc 216*f4a2713aSLionel Sambuc // VolatileMember copy-constructor: 217*f4a2713aSLionel Sambuc // CHECK-LABEL: define linkonce_odr void @_ZN14VolatileMemberC2ERKS_(%struct.VolatileMember* %this, %struct.VolatileMember*) 218*f4a2713aSLionel Sambuc // CHECK: call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}i64 16, i32 4{{.*}}) 219*f4a2713aSLionel Sambuc // CHECK: load volatile i32* {{.*}}, align 4 220*f4a2713aSLionel Sambuc // CHECK: store volatile i32 {{.*}}, align 4 221*f4a2713aSLionel Sambuc // CHECK: call void @_ZN6NonPODC1ERKS_ 222*f4a2713aSLionel Sambuc // CHECK: call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}i64 16, i32 4{{.*}}) 223*f4a2713aSLionel Sambuc // CHECK: ret void 224*f4a2713aSLionel Sambuc 225*f4a2713aSLionel Sambuc // BitfieldMember copy-constructor: 226*f4a2713aSLionel Sambuc // CHECK-LABEL: define linkonce_odr void @_ZN14BitfieldMemberC2ERKS_(%struct.BitfieldMember* %this, %struct.BitfieldMember*) 227*f4a2713aSLionel Sambuc // CHECK: call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}i64 16, i32 4{{.*}}) 228*f4a2713aSLionel Sambuc // CHECK: call void @_ZN6NonPODC1ERKS_ 229*f4a2713aSLionel Sambuc // CHECK: call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}i64 3, i32 1{{.*}}) 230*f4a2713aSLionel Sambuc // CHECK: ret void 231*f4a2713aSLionel Sambuc 232*f4a2713aSLionel Sambuc // InnerClass copy-constructor: 233*f4a2713aSLionel Sambuc // CHECK-LABEL: define linkonce_odr void @_ZN16InnerClassMemberC2ERKS_(%struct.InnerClassMember* %this, %struct.InnerClassMember*) 234*f4a2713aSLionel Sambuc // CHECK: call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}i64 32, i32 4{{.*}}) 235*f4a2713aSLionel Sambuc // CHECK: call void @_ZN6NonPODC1ERKS_ 236*f4a2713aSLionel Sambuc // CHECK: call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}i64 16, i32 4{{.*}}) 237*f4a2713aSLionel Sambuc // CHECK: ret void 238*f4a2713aSLionel Sambuc 239*f4a2713aSLionel Sambuc // ReferenceMember copy-constructor: 240*f4a2713aSLionel Sambuc // CHECK-LABEL: define linkonce_odr void @_ZN15ReferenceMemberC2ERKS_(%struct.ReferenceMember* %this, %struct.ReferenceMember*) 241*f4a2713aSLionel Sambuc // CHECK: call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}i64 16, i32 8{{.*}}) 242*f4a2713aSLionel Sambuc // CHECK: call void @_ZN6NonPODC1ERKS_ 243*f4a2713aSLionel Sambuc // CHECK: call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}i64 16, i32 8{{.*}}) 244*f4a2713aSLionel Sambuc // CHECK: ret void 245*f4a2713aSLionel Sambuc 246*f4a2713aSLionel Sambuc // BitfieldMember2 copy-constructor: 247*f4a2713aSLionel Sambuc // CHECK-2-LABEL: define linkonce_odr void @_ZN15BitfieldMember2C2ERKS_(%struct.BitfieldMember2* %this, %struct.BitfieldMember2*) 248*f4a2713aSLionel Sambuc // CHECK-2: call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}i64 16, i32 4, i1 false) 249*f4a2713aSLionel Sambuc // CHECK-2: call void @_ZN6NonPODC1ERKS_ 250*f4a2713aSLionel Sambuc // CHECK-2: ret void 251*f4a2713aSLionel Sambuc 252*f4a2713aSLionel Sambuc // PackedMembers copy-assignment: 253*f4a2713aSLionel Sambuc // CHECK-LABEL: define linkonce_odr void @_ZN13PackedMembersC2ERKS_(%struct.PackedMembers* %this, %struct.PackedMembers*) 254*f4a2713aSLionel Sambuc // CHECK: call void @_ZN6NonPODC1ERKS_ 255*f4a2713aSLionel Sambuc // CHECK: call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}i64 16, i32 1{{.*}}) 256*f4a2713aSLionel Sambuc // CHECK: ret void 257