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