blob: 5bd8adfc1d183cbdfab7daaa1b1580d05b068c7e [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{{.*}})
Lang Hamesbf122742013-02-17 07:22:09 +0000148// CHECK: load volatile i32* {{.*}}, align 4
149// 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)
Lang Hames1694e0d2013-02-27 04:14:49 +0000183CALL_CC(BitfieldMember2)
David Majnemera586eb22014-10-10 18:57:10 +0000184CALL_CC(BitfieldMember3)
Lang Hamesbf122742013-02-17 07:22:09 +0000185CALL_CC(ReferenceMember)
186CALL_CC(InnerClassMember)
187CALL_CC(BitfieldMember)
188CALL_CC(VolatileMember)
189CALL_CC(ArrayMember)
190CALL_CC(PODLikeMember)
191CALL_CC(PODMember)
192CALL_CC(Basic)
193
194// Basic copy-constructor:
Hal Finkela2347ba2014-07-18 15:52:10 +0000195// CHECK-LABEL: define linkonce_odr void @_ZN5BasicC2ERKS_(%struct.Basic* %this, %struct.Basic* dereferenceable({{[0-9]+}}))
Rafael Espindola0dc1f312013-09-03 23:14:03 +0000196// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}i64 16, i32 4{{.*}})
197// CHECK: call void @_ZN6NonPODC1ERKS_
198// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}i64 16, i32 4{{.*}})
Lang Hamesbf122742013-02-17 07:22:09 +0000199// CHECK: ret void
200
201// PODMember copy-constructor:
Hal Finkela2347ba2014-07-18 15:52:10 +0000202// CHECK-LABEL: define linkonce_odr void @_ZN9PODMemberC2ERKS_(%struct.PODMember* %this, %struct.PODMember* dereferenceable({{[0-9]+}}))
Rafael Espindola0dc1f312013-09-03 23:14:03 +0000203// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}i64 32, i32 4{{.*}})
204// CHECK: call void @_ZN6NonPODC1ERKS_
205// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}i64 16, i32 4{{.*}})
Lang Hamesbf122742013-02-17 07:22:09 +0000206// CHECK: ret void
207
208// PODLikeMember copy-constructor:
Hal Finkela2347ba2014-07-18 15:52:10 +0000209// CHECK-LABEL: define linkonce_odr void @_ZN13PODLikeMemberC2ERKS_(%struct.PODLikeMember* %this, %struct.PODLikeMember* dereferenceable({{[0-9]+}}))
Rafael Espindola0dc1f312013-09-03 23:14:03 +0000210// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}i64 32, i32 4{{.*}})
Lang Hamesbf122742013-02-17 07:22:09 +0000211// CHECK: invoke void @_ZN6NonPODC1ERKS_
Rafael Espindola0dc1f312013-09-03 23:14:03 +0000212// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}i64 16, i32 4{{.*}})
Lang Hamesbf122742013-02-17 07:22:09 +0000213// CHECK: ret void
Lang Hamesbf122742013-02-17 07:22:09 +0000214// CHECK: landingpad
215// CHECK: invoke void @_ZN7PODLikeD1Ev
216
217// ArrayMember copy-constructor:
Hal Finkela2347ba2014-07-18 15:52:10 +0000218// CHECK-LABEL: define linkonce_odr void @_ZN11ArrayMemberC2ERKS_(%struct.ArrayMember* %this, %struct.ArrayMember* dereferenceable({{[0-9]+}}))
Rafael Espindola0dc1f312013-09-03 23:14:03 +0000219// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}i64 64, i32 4{{.*}})
220// CHECK: call void @_ZN6NonPODC1ERKS_
221// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}i64 64, i32 4{{.*}})
Lang Hamesbf122742013-02-17 07:22:09 +0000222// CHECK: ret void
223
224// VolatileMember copy-constructor:
Hal Finkela2347ba2014-07-18 15:52:10 +0000225// CHECK-LABEL: define linkonce_odr void @_ZN14VolatileMemberC2ERKS_(%struct.VolatileMember* %this, %struct.VolatileMember* dereferenceable({{[0-9]+}}))
Rafael Espindola0dc1f312013-09-03 23:14:03 +0000226// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}i64 16, i32 4{{.*}})
Lang Hamesbf122742013-02-17 07:22:09 +0000227// CHECK: load volatile i32* {{.*}}, align 4
228// CHECK: store volatile i32 {{.*}}, align 4
Rafael Espindola0dc1f312013-09-03 23:14:03 +0000229// CHECK: call void @_ZN6NonPODC1ERKS_
230// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}i64 16, i32 4{{.*}})
Lang Hamesbf122742013-02-17 07:22:09 +0000231// CHECK: ret void
232
233// BitfieldMember copy-constructor:
Hal Finkela2347ba2014-07-18 15:52:10 +0000234// CHECK-LABEL: define linkonce_odr void @_ZN14BitfieldMemberC2ERKS_(%struct.BitfieldMember* %this, %struct.BitfieldMember* dereferenceable({{[0-9]+}}))
Rafael Espindola0dc1f312013-09-03 23:14:03 +0000235// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}i64 16, i32 4{{.*}})
236// CHECK: call void @_ZN6NonPODC1ERKS_
237// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}i64 3, i32 1{{.*}})
Lang Hamesbf122742013-02-17 07:22:09 +0000238// CHECK: ret void
239
240// InnerClass copy-constructor:
Hal Finkela2347ba2014-07-18 15:52:10 +0000241// CHECK-LABEL: define linkonce_odr void @_ZN16InnerClassMemberC2ERKS_(%struct.InnerClassMember* %this, %struct.InnerClassMember* dereferenceable({{[0-9]+}}))
Rafael Espindola0dc1f312013-09-03 23:14:03 +0000242// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}i64 32, i32 4{{.*}})
243// CHECK: call void @_ZN6NonPODC1ERKS_
244// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}i64 16, i32 4{{.*}})
Lang Hamesbf122742013-02-17 07:22:09 +0000245// CHECK: ret void
246
247// ReferenceMember copy-constructor:
Hal Finkela2347ba2014-07-18 15:52:10 +0000248// CHECK-LABEL: define linkonce_odr void @_ZN15ReferenceMemberC2ERKS_(%struct.ReferenceMember* %this, %struct.ReferenceMember* dereferenceable({{[0-9]+}}))
Rafael Espindola0dc1f312013-09-03 23:14:03 +0000249// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}i64 16, i32 8{{.*}})
250// CHECK: call void @_ZN6NonPODC1ERKS_
251// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}i64 16, i32 8{{.*}})
Lang Hamesbf122742013-02-17 07:22:09 +0000252// CHECK: ret void
Lang Hames1694e0d2013-02-27 04:14:49 +0000253
David Majnemera586eb22014-10-10 18:57:10 +0000254// BitfieldMember3 copy-constructor:
255// CHECK-LABEL: define linkonce_odr void @_ZN15BitfieldMember3C2ERKS_(%struct.BitfieldMember3* %this, %struct.BitfieldMember3* dereferenceable({{[0-9]+}}))
256// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64(i8* %3, i8* %4, i64 8, i32 8, i1 false)
257// CHECK: ret void
258
Lang Hames1694e0d2013-02-27 04:14:49 +0000259// BitfieldMember2 copy-constructor:
Hal Finkela2347ba2014-07-18 15:52:10 +0000260// CHECK-2-LABEL: define linkonce_odr void @_ZN15BitfieldMember2C2ERKS_(%struct.BitfieldMember2* %this, %struct.BitfieldMember2* dereferenceable({{[0-9]+}}))
Lang Hames1694e0d2013-02-27 04:14:49 +0000261// CHECK-2: call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}i64 16, i32 4, i1 false)
262// CHECK-2: call void @_ZN6NonPODC1ERKS_
263// CHECK-2: ret void
Lang Hames224ae882013-03-05 20:27:24 +0000264
265// PackedMembers copy-assignment:
Hal Finkela2347ba2014-07-18 15:52:10 +0000266// CHECK-LABEL: define linkonce_odr void @_ZN13PackedMembersC2ERKS_(%struct.PackedMembers* %this, %struct.PackedMembers* dereferenceable({{[0-9]+}}))
Rafael Espindola0dc1f312013-09-03 23:14:03 +0000267// CHECK: call void @_ZN6NonPODC1ERKS_
268// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}i64 16, i32 1{{.*}})
Lang Hames224ae882013-03-05 20:27:24 +0000269// CHECK: ret void