blob: 97d203fde2e011fa769c8749d74f5e53b98d91fb [file] [log] [blame]
Rafael Espindolaff7cea82013-09-04 04:12:25 +00001// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -emit-llvm -std=c++03 -fexceptions -fcxx-exceptions -o - %s | FileCheck %s
2// RUN: %clang_cc1 -triple i386-apple-darwin10 -emit-llvm -std=c++03 -o - %s | FileCheck --check-prefix=CHECK-2 %s
Lang Hamesbf122742013-02-17 07:22:09 +00003
4struct POD {
5 int w, x, y, z;
6};
7
8struct PODLike {
9 int w, x, y, z;
10 PODLike();
11 ~PODLike();
12};
13
14struct NonPOD {
15 NonPOD();
16 NonPOD(const NonPOD&);
17 NonPOD& operator=(const NonPOD&);
18};
19
20struct Basic {
21 int a, b, c, d;
22 NonPOD np;
23 int w, x, y, z;
24};
25
26struct PODMember {
27 int a, b, c, d;
28 POD p;
29 NonPOD np;
30 int w, x, y, z;
31};
32
33struct PODLikeMember {
34 int a, b, c, d;
35 PODLike pl;
36 NonPOD np;
37 int w, x, y, z;
38};
39
40struct ArrayMember {
41 int a, b, c, d;
42 int e[12];
43 NonPOD np;
44 int f[12];
45 int w, x, y, z;
46};
47
48struct VolatileMember {
49 int a, b, c, d;
50 volatile int v;
51 NonPOD np;
52 int w, x, y, z;
53};
54
55struct BitfieldMember {
56 int a, b, c, d;
57 NonPOD np;
58 int w : 6;
59 int x : 6;
60 int y : 6;
61 int z : 6;
62};
63
Lang Hames1694e0d2013-02-27 04:14:49 +000064struct BitfieldMember2 {
65 unsigned a : 1;
66 unsigned b, c, d;
67 NonPOD np;
68};
69
David Majnemera586eb22014-10-10 18:57:10 +000070struct BitfieldMember3 {
71 virtual void f();
72 int : 8;
73 int x : 1;
74 int y;
75};
76
Lang Hamesbf122742013-02-17 07:22:09 +000077struct InnerClassMember {
78 struct {
79 int a, b, c, d;
80 } a;
81 int b, c, d, e;
82 NonPOD np;
83 int w, x, y, z;
84};
85
86struct ReferenceMember {
87 ReferenceMember(int &a, int &b, int &c, int &d)
88 : a(a), b(b), c(c), d(d) {}
89 int &a;
90 int &b;
91 NonPOD np;
92 int &c;
93 int &d;
94};
95
Lang Hames224ae882013-03-05 20:27:24 +000096struct __attribute__((packed)) PackedMembers {
97 char c;
98 NonPOD np;
99 int w, x, y, z;
100};
101
Lang Hamesbf122742013-02-17 07:22:09 +0000102// COPY-ASSIGNMENT OPERATORS:
103
104// Assignment operators are output in the order they're encountered.
105
106#define CALL_AO(T) void callAO##T(T& a, const T& b) { a = b; }
107
108CALL_AO(Basic)
109CALL_AO(PODMember)
110CALL_AO(PODLikeMember)
111CALL_AO(ArrayMember)
112CALL_AO(VolatileMember)
113CALL_AO(BitfieldMember)
114CALL_AO(InnerClassMember)
Lang Hames224ae882013-03-05 20:27:24 +0000115CALL_AO(PackedMembers)
Lang Hamesbf122742013-02-17 07:22:09 +0000116
117// Basic copy-assignment:
Hal Finkela2347ba2014-07-18 15:52:10 +0000118// CHECK-LABEL: define linkonce_odr dereferenceable({{[0-9]+}}) %struct.Basic* @_ZN5BasicaSERKS_(%struct.Basic* %this, %struct.Basic* dereferenceable({{[0-9]+}}))
Rafael Espindola0dc1f312013-09-03 23:14:03 +0000119// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}i64 16, i32 4{{.*}})
Hal Finkela2347ba2014-07-18 15:52:10 +0000120// CHECK: call dereferenceable({{[0-9]+}}) %struct.NonPOD* @_ZN6NonPODaSERKS_
Rafael Espindola0dc1f312013-09-03 23:14:03 +0000121// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}i64 16, i32 4{{.*}})
Rafael Espindolacc7ee372013-09-03 23:52:53 +0000122// CHECK: ret %struct.Basic*
Lang Hamesbf122742013-02-17 07:22:09 +0000123
124// PODMember copy-assignment:
Hal Finkela2347ba2014-07-18 15:52:10 +0000125// CHECK-LABEL: define linkonce_odr dereferenceable({{[0-9]+}}) %struct.PODMember* @_ZN9PODMemberaSERKS_(%struct.PODMember* %this, %struct.PODMember* dereferenceable({{[0-9]+}}))
Rafael Espindola0dc1f312013-09-03 23:14:03 +0000126// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}i64 32, i32 4{{.*}})
Hal Finkela2347ba2014-07-18 15:52:10 +0000127// CHECK: call dereferenceable({{[0-9]+}}) %struct.NonPOD* @_ZN6NonPODaSERKS_
Rafael Espindola0dc1f312013-09-03 23:14:03 +0000128// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}i64 16, i32 4{{.*}})
Rafael Espindolacc7ee372013-09-03 23:52:53 +0000129// CHECK: ret %struct.PODMember*
Lang Hamesbf122742013-02-17 07:22:09 +0000130
131// PODLikeMember copy-assignment:
Hal Finkela2347ba2014-07-18 15:52:10 +0000132// CHECK-LABEL: define linkonce_odr dereferenceable({{[0-9]+}}) %struct.PODLikeMember* @_ZN13PODLikeMemberaSERKS_(%struct.PODLikeMember* %this, %struct.PODLikeMember* dereferenceable({{[0-9]+}}))
Rafael Espindola0dc1f312013-09-03 23:14:03 +0000133// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}i64 32, i32 4{{.*}})
Hal Finkela2347ba2014-07-18 15:52:10 +0000134// CHECK: call dereferenceable({{[0-9]+}}) %struct.NonPOD* @_ZN6NonPODaSERKS_
Rafael Espindola0dc1f312013-09-03 23:14:03 +0000135// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}i64 16, i32 4{{.*}})
Rafael Espindolacc7ee372013-09-03 23:52:53 +0000136// CHECK: ret %struct.PODLikeMember*
Lang Hamesbf122742013-02-17 07:22:09 +0000137
138// ArrayMember copy-assignment:
Hal Finkela2347ba2014-07-18 15:52:10 +0000139// CHECK-LABEL: define linkonce_odr dereferenceable({{[0-9]+}}) %struct.ArrayMember* @_ZN11ArrayMemberaSERKS_(%struct.ArrayMember* %this, %struct.ArrayMember* dereferenceable({{[0-9]+}}))
Rafael Espindola0dc1f312013-09-03 23:14:03 +0000140// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}i64 64, i32 4{{.*}})
Hal Finkela2347ba2014-07-18 15:52:10 +0000141// CHECK: call dereferenceable({{[0-9]+}}) %struct.NonPOD* @_ZN6NonPODaSERKS_
Rafael Espindola0dc1f312013-09-03 23:14:03 +0000142// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}i64 64, i32 4{{.*}})
Rafael Espindolacc7ee372013-09-03 23:52:53 +0000143// CHECK: ret %struct.ArrayMember*
Lang Hamesbf122742013-02-17 07:22:09 +0000144
145// VolatileMember copy-assignment:
Hal Finkela2347ba2014-07-18 15:52:10 +0000146// CHECK-LABEL: define linkonce_odr dereferenceable({{[0-9]+}}) %struct.VolatileMember* @_ZN14VolatileMemberaSERKS_(%struct.VolatileMember* %this, %struct.VolatileMember* dereferenceable({{[0-9]+}}))
Rafael Espindola0dc1f312013-09-03 23:14:03 +0000147// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}i64 16, i32 4{{.*}})
David Blaikiea953f282015-02-27 21:19:58 +0000148// CHECK: load volatile i32, i32* {{.*}}, align 4
Lang Hamesbf122742013-02-17 07:22:09 +0000149// CHECK: store volatile i32 {{.*}}, align 4
Hal Finkela2347ba2014-07-18 15:52:10 +0000150// CHECK: call dereferenceable({{[0-9]+}}) %struct.NonPOD* @_ZN6NonPODaSERKS_
Rafael Espindola0dc1f312013-09-03 23:14:03 +0000151// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}i64 16, i32 4{{.*}})
Rafael Espindolacc7ee372013-09-03 23:52:53 +0000152// CHECK: ret %struct.VolatileMember*
Lang Hamesbf122742013-02-17 07:22:09 +0000153
154// BitfieldMember copy-assignment:
Hal Finkela2347ba2014-07-18 15:52:10 +0000155// CHECK-LABEL: define linkonce_odr dereferenceable({{[0-9]+}}) %struct.BitfieldMember* @_ZN14BitfieldMemberaSERKS_(%struct.BitfieldMember* %this, %struct.BitfieldMember* dereferenceable({{[0-9]+}}))
Rafael Espindola0dc1f312013-09-03 23:14:03 +0000156// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}i64 16, i32 4{{.*}})
Hal Finkela2347ba2014-07-18 15:52:10 +0000157// CHECK: call dereferenceable({{[0-9]+}}) %struct.NonPOD* @_ZN6NonPODaSERKS_
Rafael Espindola0dc1f312013-09-03 23:14:03 +0000158// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}i64 3, i32 1{{.*}})
Rafael Espindolacc7ee372013-09-03 23:52:53 +0000159// CHECK: ret %struct.BitfieldMember*
Lang Hamesbf122742013-02-17 07:22:09 +0000160
161// InnerClass copy-assignment:
Hal Finkela2347ba2014-07-18 15:52:10 +0000162// CHECK-LABEL: define linkonce_odr dereferenceable({{[0-9]+}}) %struct.InnerClassMember* @_ZN16InnerClassMemberaSERKS_(%struct.InnerClassMember* %this, %struct.InnerClassMember* dereferenceable({{[0-9]+}}))
Rafael Espindola0dc1f312013-09-03 23:14:03 +0000163// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}i64 32, i32 4{{.*}})
Hal Finkela2347ba2014-07-18 15:52:10 +0000164// CHECK: call dereferenceable({{[0-9]+}}) %struct.NonPOD* @_ZN6NonPODaSERKS_
Rafael Espindola0dc1f312013-09-03 23:14:03 +0000165// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}i64 16, i32 4{{.*}})
Rafael Espindolacc7ee372013-09-03 23:52:53 +0000166// CHECK: ret %struct.InnerClassMember*
Lang Hamesbf122742013-02-17 07:22:09 +0000167
Lang Hames224ae882013-03-05 20:27:24 +0000168// PackedMembers copy-assignment:
Hal Finkela2347ba2014-07-18 15:52:10 +0000169// CHECK-LABEL: define linkonce_odr dereferenceable({{[0-9]+}}) %struct.PackedMembers* @_ZN13PackedMembersaSERKS_(%struct.PackedMembers* %this, %struct.PackedMembers* dereferenceable({{[0-9]+}}))
170// CHECK: call dereferenceable({{[0-9]+}}) %struct.NonPOD* @_ZN6NonPODaSERKS_
Rafael Espindola0dc1f312013-09-03 23:14:03 +0000171// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}i64 16, i32 1{{.*}})
Rafael Espindolacc7ee372013-09-03 23:52:53 +0000172// CHECK: ret %struct.PackedMembers*
Lang Hames224ae882013-03-05 20:27:24 +0000173
Lang Hamesbf122742013-02-17 07:22:09 +0000174// COPY-CONSTRUCTORS:
175
176// Clang outputs copy-constructors in the reverse of the order that
177// copy-constructor calls are encountered. Add functions that call the copy
178// constructors of the classes above in reverse order here.
179
180#define CALL_CC(T) T callCC##T(const T& b) { return b; }
181
Lang Hames224ae882013-03-05 20:27:24 +0000182CALL_CC(PackedMembers)
Rafael Espindolae5df59f2015-01-22 00:24:57 +0000183// PackedMembers copy-assignment:
184// CHECK-LABEL: define linkonce_odr void @_ZN13PackedMembersC2ERKS_(%struct.PackedMembers* %this, %struct.PackedMembers* dereferenceable({{[0-9]+}}))
185// CHECK: call void @_ZN6NonPODC1ERKS_
186// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}i64 16, i32 1{{.*}})
187// CHECK: ret void
188
Lang Hames1694e0d2013-02-27 04:14:49 +0000189CALL_CC(BitfieldMember2)
Rafael Espindolae5df59f2015-01-22 00:24:57 +0000190// BitfieldMember2 copy-constructor:
191// CHECK-2-LABEL: define linkonce_odr void @_ZN15BitfieldMember2C2ERKS_(%struct.BitfieldMember2* %this, %struct.BitfieldMember2* dereferenceable({{[0-9]+}}))
192// CHECK-2: call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}i64 16, i32 4, i1 false)
193// CHECK-2: call void @_ZN6NonPODC1ERKS_
194// CHECK-2: ret void
195
David Majnemera586eb22014-10-10 18:57:10 +0000196CALL_CC(BitfieldMember3)
Rafael Espindolae5df59f2015-01-22 00:24:57 +0000197// BitfieldMember3 copy-constructor:
198// CHECK-LABEL: define linkonce_odr void @_ZN15BitfieldMember3C2ERKS_(%struct.BitfieldMember3* %this, %struct.BitfieldMember3* dereferenceable({{[0-9]+}}))
199// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}i64 8, i32 8, i1 false)
200// CHECK: ret void
201
Lang Hamesbf122742013-02-17 07:22:09 +0000202CALL_CC(ReferenceMember)
Rafael Espindolae5df59f2015-01-22 00:24:57 +0000203// ReferenceMember copy-constructor:
204// CHECK-LABEL: define linkonce_odr void @_ZN15ReferenceMemberC2ERKS_(%struct.ReferenceMember* %this, %struct.ReferenceMember* dereferenceable({{[0-9]+}}))
205// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}i64 16, i32 8{{.*}})
206// CHECK: call void @_ZN6NonPODC1ERKS_
207// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}i64 16, i32 8{{.*}})
208// CHECK: ret void
209
Lang Hamesbf122742013-02-17 07:22:09 +0000210CALL_CC(InnerClassMember)
Rafael Espindolae5df59f2015-01-22 00:24:57 +0000211// InnerClass copy-constructor:
212// CHECK-LABEL: define linkonce_odr void @_ZN16InnerClassMemberC2ERKS_(%struct.InnerClassMember* %this, %struct.InnerClassMember* dereferenceable({{[0-9]+}}))
213// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}i64 32, i32 4{{.*}})
214// CHECK: call void @_ZN6NonPODC1ERKS_
215// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}i64 16, i32 4{{.*}})
216// CHECK: ret void
217
Lang Hamesbf122742013-02-17 07:22:09 +0000218CALL_CC(BitfieldMember)
Rafael Espindolae5df59f2015-01-22 00:24:57 +0000219// BitfieldMember copy-constructor:
220// CHECK-LABEL: define linkonce_odr void @_ZN14BitfieldMemberC2ERKS_(%struct.BitfieldMember* %this, %struct.BitfieldMember* dereferenceable({{[0-9]+}}))
221// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}i64 16, i32 4{{.*}})
222// CHECK: call void @_ZN6NonPODC1ERKS_
223// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}i64 3, i32 1{{.*}})
224// CHECK: ret void
225
Lang Hamesbf122742013-02-17 07:22:09 +0000226CALL_CC(VolatileMember)
Lang Hamesbf122742013-02-17 07:22:09 +0000227// VolatileMember copy-constructor:
Hal Finkela2347ba2014-07-18 15:52:10 +0000228// CHECK-LABEL: define linkonce_odr void @_ZN14VolatileMemberC2ERKS_(%struct.VolatileMember* %this, %struct.VolatileMember* dereferenceable({{[0-9]+}}))
Rafael Espindola0dc1f312013-09-03 23:14:03 +0000229// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}i64 16, i32 4{{.*}})
David Blaikiea953f282015-02-27 21:19:58 +0000230// CHECK: load volatile i32, i32* {{.*}}, align 4
Lang Hamesbf122742013-02-17 07:22:09 +0000231// CHECK: store volatile i32 {{.*}}, align 4
Rafael Espindola0dc1f312013-09-03 23:14:03 +0000232// CHECK: call void @_ZN6NonPODC1ERKS_
233// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}i64 16, i32 4{{.*}})
Lang Hamesbf122742013-02-17 07:22:09 +0000234// CHECK: ret void
235
Rafael Espindolae5df59f2015-01-22 00:24:57 +0000236CALL_CC(ArrayMember)
237// ArrayMember copy-constructor:
238// CHECK-LABEL: define linkonce_odr void @_ZN11ArrayMemberC2ERKS_(%struct.ArrayMember* %this, %struct.ArrayMember* dereferenceable({{[0-9]+}}))
239// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}i64 64, i32 4{{.*}})
Rafael Espindola0dc1f312013-09-03 23:14:03 +0000240// CHECK: call void @_ZN6NonPODC1ERKS_
Rafael Espindolae5df59f2015-01-22 00:24:57 +0000241// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}i64 64, i32 4{{.*}})
Lang Hamesbf122742013-02-17 07:22:09 +0000242// CHECK: ret void
243
Rafael Espindolae5df59f2015-01-22 00:24:57 +0000244CALL_CC(PODLikeMember)
245// PODLikeMember copy-constructor:
246// CHECK-LABEL: define linkonce_odr void @_ZN13PODLikeMemberC2ERKS_(%struct.PODLikeMember* %this, %struct.PODLikeMember* dereferenceable({{[0-9]+}}))
247// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}i64 32, i32 4{{.*}})
248// CHECK: invoke void @_ZN6NonPODC1ERKS_
249// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}i64 16, i32 4{{.*}})
250// CHECK: ret void
251// CHECK: landingpad
252// CHECK: invoke void @_ZN7PODLikeD1Ev
253
254CALL_CC(PODMember)
255// PODMember copy-constructor:
256// CHECK-LABEL: define linkonce_odr void @_ZN9PODMemberC2ERKS_(%struct.PODMember* %this, %struct.PODMember* dereferenceable({{[0-9]+}}))
Rafael Espindola0dc1f312013-09-03 23:14:03 +0000257// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}i64 32, i32 4{{.*}})
258// CHECK: call void @_ZN6NonPODC1ERKS_
259// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}i64 16, i32 4{{.*}})
Lang Hamesbf122742013-02-17 07:22:09 +0000260// CHECK: ret void
261
Rafael Espindolae5df59f2015-01-22 00:24:57 +0000262CALL_CC(Basic)
263// Basic copy-constructor:
264// CHECK-LABEL: define linkonce_odr void @_ZN5BasicC2ERKS_(%struct.Basic* %this, %struct.Basic* dereferenceable({{[0-9]+}}))
265// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}i64 16, i32 4{{.*}})
Rafael Espindola0dc1f312013-09-03 23:14:03 +0000266// CHECK: call void @_ZN6NonPODC1ERKS_
Rafael Espindolae5df59f2015-01-22 00:24:57 +0000267// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}i64 16, i32 4{{.*}})
Lang Hames224ae882013-03-05 20:27:24 +0000268// CHECK: ret void