xref: /minix3/external/bsd/llvm/dist/clang/test/CodeGenCXX/pod-member-memcpys.cpp (revision f4a2713ac843a11c696ec80c0a5e3e5d80b4d338)
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