blob: 1e76c08899abdc473e85b35dc8d67bda0442e210 [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
Lang Hames1694e0d2013-02-27 04:14:49 +00002// RUN: %clang_cc1 -triple i386-apple-darwin10 -emit-llvm -std=c++03 -O0 -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
Lang Hamesbf122742013-02-17 07:22:09 +000070struct InnerClassMember {
71 struct {
72 int a, b, c, d;
73 } a;
74 int b, c, d, e;
75 NonPOD np;
76 int w, x, y, z;
77};
78
79struct ReferenceMember {
80 ReferenceMember(int &a, int &b, int &c, int &d)
81 : a(a), b(b), c(c), d(d) {}
82 int &a;
83 int &b;
84 NonPOD np;
85 int &c;
86 int &d;
87};
88
89// COPY-ASSIGNMENT OPERATORS:
90
91// Assignment operators are output in the order they're encountered.
92
93#define CALL_AO(T) void callAO##T(T& a, const T& b) { a = b; }
94
95CALL_AO(Basic)
96CALL_AO(PODMember)
97CALL_AO(PODLikeMember)
98CALL_AO(ArrayMember)
99CALL_AO(VolatileMember)
100CALL_AO(BitfieldMember)
101CALL_AO(InnerClassMember)
102
103// Basic copy-assignment:
104// CHECK: define linkonce_odr %struct.Basic* @_ZN5BasicaSERKS_(%struct.Basic* %this, %struct.Basic*)
105// CHECK: tail call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}i64 16, 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.Basic* %this
109
110// PODMember copy-assignment:
111// CHECK: define linkonce_odr %struct.PODMember* @_ZN9PODMemberaSERKS_(%struct.PODMember* %this, %struct.PODMember*)
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.PODMember* %this
116
117// PODLikeMember copy-assignment:
118// CHECK: define linkonce_odr %struct.PODLikeMember* @_ZN13PODLikeMemberaSERKS_(%struct.PODLikeMember* %this, %struct.PODLikeMember*)
119// CHECK: tail call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}i64 32, i32 4{{.*}})
120// CHECK: tail call %struct.NonPOD* @_ZN6NonPODaSERKS_
121// CHECK: tail call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}i64 16, i32 4{{.*}})
122// CHECK: ret %struct.PODLikeMember* %this
123
124// ArrayMember copy-assignment:
125// CHECK: define linkonce_odr %struct.ArrayMember* @_ZN11ArrayMemberaSERKS_(%struct.ArrayMember* %this, %struct.ArrayMember*)
126// CHECK: tail call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}i64 64, i32 4{{.*}})
127// CHECK: tail call %struct.NonPOD* @_ZN6NonPODaSERKS_
128// CHECK: tail call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}i64 64, i32 4{{.*}})
129// CHECK: ret %struct.ArrayMember* %this
130
131// VolatileMember copy-assignment:
132// CHECK: define linkonce_odr %struct.VolatileMember* @_ZN14VolatileMemberaSERKS_(%struct.VolatileMember* %this, %struct.VolatileMember*)
133// CHECK: tail call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}i64 16, i32 4{{.*}})
134// CHECK: load volatile i32* {{.*}}, align 4
135// CHECK: store volatile i32 {{.*}}, align 4
136// CHECK: tail call %struct.NonPOD* @_ZN6NonPODaSERKS_
137// CHECK: tail call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}i64 16, i32 4{{.*}})
138// CHECK: ret %struct.VolatileMember* %this
139
140// BitfieldMember copy-assignment:
141// CHECK: define linkonce_odr %struct.BitfieldMember* @_ZN14BitfieldMemberaSERKS_(%struct.BitfieldMember* %this, %struct.BitfieldMember*)
142// CHECK: tail call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}i64 16, i32 4{{.*}})
143// CHECK: tail call %struct.NonPOD* @_ZN6NonPODaSERKS_
144// CHECK: tail call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}i64 3, i32 1{{.*}})
145// CHECK: ret %struct.BitfieldMember* %this
146
147// InnerClass copy-assignment:
148// CHECK: define linkonce_odr %struct.InnerClassMember* @_ZN16InnerClassMemberaSERKS_(%struct.InnerClassMember* %this, %struct.InnerClassMember*)
149// CHECK: tail call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}i64 32, i32 4{{.*}})
150// CHECK: tail call %struct.NonPOD* @_ZN6NonPODaSERKS_
151// CHECK: tail call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}i64 16, i32 4{{.*}})
152// CHECK: ret %struct.InnerClassMember* %this
153
154// COPY-CONSTRUCTORS:
155
156// Clang outputs copy-constructors in the reverse of the order that
157// copy-constructor calls are encountered. Add functions that call the copy
158// constructors of the classes above in reverse order here.
159
160#define CALL_CC(T) T callCC##T(const T& b) { return b; }
161
Lang Hames1694e0d2013-02-27 04:14:49 +0000162CALL_CC(BitfieldMember2)
Lang Hamesbf122742013-02-17 07:22:09 +0000163CALL_CC(ReferenceMember)
164CALL_CC(InnerClassMember)
165CALL_CC(BitfieldMember)
166CALL_CC(VolatileMember)
167CALL_CC(ArrayMember)
168CALL_CC(PODLikeMember)
169CALL_CC(PODMember)
170CALL_CC(Basic)
171
172// Basic copy-constructor:
173// CHECK: define linkonce_odr void @_ZN5BasicC2ERKS_(%struct.Basic* %this, %struct.Basic*)
174// CHECK: tail call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}i64 16, i32 4{{.*}})
175// CHECK: tail call void @_ZN6NonPODC1ERKS_
176// CHECK: tail call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}i64 16, i32 4{{.*}})
177// CHECK: ret void
178
179// PODMember copy-constructor:
180// CHECK: define linkonce_odr void @_ZN9PODMemberC2ERKS_(%struct.PODMember* %this, %struct.PODMember*)
181// CHECK: tail call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}i64 32, i32 4{{.*}})
182// CHECK: tail call void @_ZN6NonPODC1ERKS_
183// CHECK: tail call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}i64 16, i32 4{{.*}})
184// CHECK: ret void
185
186// PODLikeMember copy-constructor:
187// CHECK: define linkonce_odr void @_ZN13PODLikeMemberC2ERKS_(%struct.PODLikeMember* %this, %struct.PODLikeMember*)
188// CHECK: tail call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}i64 32, i32 4{{.*}})
189// CHECK: invoke void @_ZN6NonPODC1ERKS_
Lang Hamesbf122742013-02-17 07:22:09 +0000190// CHECK: tail call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}i64 16, i32 4{{.*}})
191// CHECK: ret void
Lang Hamesbf122742013-02-17 07:22:09 +0000192// CHECK: landingpad
193// CHECK: invoke void @_ZN7PODLikeD1Ev
194
195// ArrayMember copy-constructor:
196// CHECK: define linkonce_odr void @_ZN11ArrayMemberC2ERKS_(%struct.ArrayMember* %this, %struct.ArrayMember*)
197// CHECK: tail call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}i64 64, i32 4{{.*}})
198// CHECK: tail call void @_ZN6NonPODC1ERKS_
199// CHECK: tail call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}i64 64, i32 4{{.*}})
200// CHECK: ret void
201
202// VolatileMember copy-constructor:
203// CHECK: define linkonce_odr void @_ZN14VolatileMemberC2ERKS_(%struct.VolatileMember* %this, %struct.VolatileMember*)
204// CHECK: tail call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}i64 16, i32 4{{.*}})
205// CHECK: load volatile i32* {{.*}}, align 4
206// CHECK: store volatile i32 {{.*}}, align 4
207// CHECK: tail call void @_ZN6NonPODC1ERKS_
208// CHECK: tail call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}i64 16, i32 4{{.*}})
209// CHECK: ret void
210
211// BitfieldMember copy-constructor:
212// CHECK: define linkonce_odr void @_ZN14BitfieldMemberC2ERKS_(%struct.BitfieldMember* %this, %struct.BitfieldMember*)
213// CHECK: tail call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}i64 16, i32 4{{.*}})
214// CHECK: tail call void @_ZN6NonPODC1ERKS_
215// CHECK: tail call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}i64 3, i32 1{{.*}})
216// CHECK: ret void
217
218// InnerClass copy-constructor:
219// CHECK: define linkonce_odr void @_ZN16InnerClassMemberC2ERKS_(%struct.InnerClassMember* %this, %struct.InnerClassMember*)
220// CHECK: tail call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}i64 32, i32 4{{.*}})
221// CHECK: tail call void @_ZN6NonPODC1ERKS_
222// CHECK: tail call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}i64 16, i32 4{{.*}})
223// CHECK: ret void
224
225// ReferenceMember copy-constructor:
226// CHECK: define linkonce_odr void @_ZN15ReferenceMemberC2ERKS_(%struct.ReferenceMember* %this, %struct.ReferenceMember*)
227// CHECK: tail call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}i64 16, i32 8{{.*}})
228// CHECK: tail call void @_ZN6NonPODC1ERKS_
229// CHECK: tail call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}i64 16, i32 8{{.*}})
230// CHECK: ret void
Lang Hames1694e0d2013-02-27 04:14:49 +0000231
232// BitfieldMember2 copy-constructor:
233// CHECK-2: define linkonce_odr void @_ZN15BitfieldMember2C2ERKS_(%struct.BitfieldMember2* %this, %struct.BitfieldMember2*)
234// CHECK-2: call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}i64 16, i32 4, i1 false)
235// CHECK-2: call void @_ZN6NonPODC1ERKS_
236// CHECK-2: ret void