1 // RUN: %clang_cc1 -std=c++11 -triple x86_64-unknown-unknown -emit-llvm -o - %s | FileCheck %s --check-prefix=CHECK --check-prefix=NEWABI
2 // RUN: %clang_cc1 -std=c++11 -triple x86_64-unknown-unknown -fclang-abi-compat=4.0 -emit-llvm -o - %s | FileCheck %s --check-prefix=CHECK --check-prefix=OLDABI
3 // RUN: %clang_cc1 -std=c++11 -triple x86_64-scei-ps4 -emit-llvm -o - %s | FileCheck %s --check-prefix=CHECK --check-prefix=OLDABI
4 // RUN: %clang_cc1 -std=c++11 -triple x86_64-windows-msvc -emit-llvm -o - %s -fms-compatibility -fms-compatibility-version=18 | FileCheck %s -check-prefix=WIN64 -check-prefix=WIN64-18
5 // RUN: %clang_cc1 -std=c++11 -triple x86_64-windows-msvc -emit-llvm -o - %s -fms-compatibility -fms-compatibility-version=19 | FileCheck %s -check-prefix=WIN64 -check-prefix=WIN64-19
8 // Trivial structs should be passed directly.
16 // CHECK-LABEL: define void @_ZN7trivial3barEv()
17 // CHECK: alloca %"struct.trivial::A"
18 // CHECK: load i8*, i8**
19 // CHECK: call void @_ZN7trivial3fooENS_1AE(i8* %{{.*}})
20 // CHECK-LABEL: declare void @_ZN7trivial3fooENS_1AE(i8*)
22 // WIN64-LABEL: declare dso_local void @"?foo@trivial@@YAXUA@1@@Z"(i64)
25 namespace default_ctor {
32 // Core issue 1590. We can pass this type in registers, even though C++
33 // normally doesn't permit copies when using braced initialization.
36 // CHECK-LABEL: define void @_ZN12default_ctor3barEv()
37 // CHECK: alloca %"struct.default_ctor::A"
38 // CHECK: call void @_Z{{.*}}C1Ev(
39 // CHECK: load i8*, i8**
40 // CHECK: call void @_ZN12default_ctor3fooENS_1AE(i8* %{{.*}})
41 // CHECK-LABEL: declare void @_ZN12default_ctor3fooENS_1AE(i8*)
43 // WIN64-LABEL: declare dso_local void @"?foo@default_ctor@@YAXUA@1@@Z"(i64)
47 // The presence of a move constructor implicitly deletes the trivial copy ctor
48 // and means that we have to pass this struct by address.
58 // CHECK-LABEL: define void @_ZN9move_ctor3barEv()
59 // CHECK: call void @_Z{{.*}}C1Ev(
61 // NEWABI: call void @_ZN9move_ctor3fooENS_1AE(%"struct.move_ctor::A"* %{{.*}})
62 // OLDABI: call void @_ZN9move_ctor3fooENS_1AE(i8* %{{.*}})
63 // NEWABI-LABEL: declare void @_ZN9move_ctor3fooENS_1AE(%"struct.move_ctor::A"*)
64 // OLDABI-LABEL: declare void @_ZN9move_ctor3fooENS_1AE(i8*)
66 // WIN64-LABEL: declare dso_local void @"?foo@move_ctor@@YAXUA@1@@Z"(%"struct.move_ctor::A"*)
69 namespace all_deleted {
72 A(const A &o) = delete;
80 // CHECK-LABEL: define void @_ZN11all_deleted3barEv()
81 // CHECK: call void @_Z{{.*}}C1Ev(
83 // NEWABI: call void @_ZN11all_deleted3fooENS_1AE(%"struct.all_deleted::A"* %{{.*}})
84 // OLDABI: call void @_ZN11all_deleted3fooENS_1AE(i8* %{{.*}})
85 // NEWABI-LABEL: declare void @_ZN11all_deleted3fooENS_1AE(%"struct.all_deleted::A"*)
86 // OLDABI-LABEL: declare void @_ZN11all_deleted3fooENS_1AE(i8*)
88 // WIN64-LABEL: declare dso_local void @"?foo@all_deleted@@YAXUA@1@@Z"(%"struct.all_deleted::A"*)
91 namespace implicitly_deleted {
101 // CHECK-LABEL: define void @_ZN18implicitly_deleted3barEv()
102 // CHECK: call void @_Z{{.*}}C1Ev(
104 // NEWABI: call void @_ZN18implicitly_deleted3fooENS_1AE(%"struct.implicitly_deleted::A"* %{{.*}})
105 // OLDABI: call void @_ZN18implicitly_deleted3fooENS_1AE(i8* %{{.*}})
106 // NEWABI-LABEL: declare void @_ZN18implicitly_deleted3fooENS_1AE(%"struct.implicitly_deleted::A"*)
107 // OLDABI-LABEL: declare void @_ZN18implicitly_deleted3fooENS_1AE(i8*)
109 // In MSVC 2013, the copy ctor is not deleted by a move assignment. In MSVC 2015, it is.
110 // WIN64-18-LABEL: declare dso_local void @"?foo@implicitly_deleted@@YAXUA@1@@Z"(i64
111 // WIN64-19-LABEL: declare dso_local void @"?foo@implicitly_deleted@@YAXUA@1@@Z"(%"struct.implicitly_deleted::A"*)
114 namespace one_deleted {
124 // CHECK-LABEL: define void @_ZN11one_deleted3barEv()
125 // CHECK: call void @_Z{{.*}}C1Ev(
127 // NEWABI: call void @_ZN11one_deleted3fooENS_1AE(%"struct.one_deleted::A"* %{{.*}})
128 // OLDABI: call void @_ZN11one_deleted3fooENS_1AE(i8* %{{.*}})
129 // NEWABI-LABEL: declare void @_ZN11one_deleted3fooENS_1AE(%"struct.one_deleted::A"*)
130 // OLDABI-LABEL: declare void @_ZN11one_deleted3fooENS_1AE(i8*)
132 // WIN64-LABEL: declare dso_local void @"?foo@one_deleted@@YAXUA@1@@Z"(%"struct.one_deleted::A"*)
135 namespace copy_defaulted {
138 A(const A &o) = default;
146 // CHECK-LABEL: define void @_ZN14copy_defaulted3barEv()
147 // CHECK: call void @_Z{{.*}}C1Ev(
148 // CHECK: load i8*, i8**
149 // CHECK: call void @_ZN14copy_defaulted3fooENS_1AE(i8* %{{.*}})
150 // CHECK-LABEL: declare void @_ZN14copy_defaulted3fooENS_1AE(i8*)
152 // WIN64-LABEL: declare dso_local void @"?foo@copy_defaulted@@YAXUA@1@@Z"(i64)
155 namespace move_defaulted {
158 A(const A &o) = delete;
166 // CHECK-LABEL: define void @_ZN14move_defaulted3barEv()
167 // CHECK: call void @_Z{{.*}}C1Ev(
168 // CHECK: load i8*, i8**
169 // CHECK: call void @_ZN14move_defaulted3fooENS_1AE(i8* %{{.*}})
170 // CHECK-LABEL: declare void @_ZN14move_defaulted3fooENS_1AE(i8*)
172 // WIN64-LABEL: declare dso_local void @"?foo@move_defaulted@@YAXUA@1@@Z"(%"struct.move_defaulted::A"*)
175 namespace trivial_defaulted {
178 A(const A &o) = default;
185 // CHECK-LABEL: define void @_ZN17trivial_defaulted3barEv()
186 // CHECK: call void @_Z{{.*}}C1Ev(
187 // CHECK: load i8*, i8**
188 // CHECK: call void @_ZN17trivial_defaulted3fooENS_1AE(i8* %{{.*}})
189 // CHECK-LABEL: declare void @_ZN17trivial_defaulted3fooENS_1AE(i8*)
191 // WIN64-LABEL: declare dso_local void @"?foo@trivial_defaulted@@YAXUA@1@@Z"(i64)
194 namespace two_copy_ctors {
197 A(const A &) = default;
198 A(const A &, int = 0);
207 // CHECK-LABEL: define void @_ZN14two_copy_ctors3barEv()
208 // CHECK: call void @_Z{{.*}}C1Ev(
209 // NEWABI: call void @_ZN14two_copy_ctors3fooENS_1BE(%"struct.two_copy_ctors::B"* %{{.*}})
210 // OLDABI: call void @_ZN14two_copy_ctors3fooENS_1BE(%"struct.two_copy_ctors::B"* byval
211 // NEWABI-LABEL: declare void @_ZN14two_copy_ctors3fooENS_1BE(%"struct.two_copy_ctors::B"*)
212 // OLDABI-LABEL: declare void @_ZN14two_copy_ctors3fooENS_1BE(%"struct.two_copy_ctors::B"* byval
214 // WIN64-LABEL: declare dso_local void @"?foo@two_copy_ctors@@YAXUB@1@@Z"(%"struct.two_copy_ctors::B"*)
217 namespace definition_only {
223 void *foo(A a) { return a.p; }
224 // NEWABI-LABEL: define i8* @_ZN15definition_only3fooENS_1AE(%"struct.definition_only::A"*
225 // OLDABI-LABEL: define i8* @_ZN15definition_only3fooENS_1AE(i8*
226 // WIN64-LABEL: define dso_local i8* @"?foo@definition_only@@YAPEAXUA@1@@Z"(%"struct.definition_only::A"*
229 namespace deleted_by_member {
239 void *foo(A a) { return a.b.p; }
240 // NEWABI-LABEL: define i8* @_ZN17deleted_by_member3fooENS_1AE(%"struct.deleted_by_member::A"*
241 // OLDABI-LABEL: define i8* @_ZN17deleted_by_member3fooENS_1AE(i8*
242 // WIN64-LABEL: define dso_local i8* @"?foo@deleted_by_member@@YAPEAXUA@1@@Z"(%"struct.deleted_by_member::A"*
245 namespace deleted_by_base {
254 void *foo(A a) { return a.p; }
255 // NEWABI-LABEL: define i8* @_ZN15deleted_by_base3fooENS_1AE(%"struct.deleted_by_base::A"*
256 // OLDABI-LABEL: define i8* @_ZN15deleted_by_base3fooENS_1AE(i8*
257 // WIN64-LABEL: define dso_local i8* @"?foo@deleted_by_base@@YAPEAXUA@1@@Z"(%"struct.deleted_by_base::A"*
260 namespace deleted_by_member_copy {
263 B(const B &o) = delete;
270 void *foo(A a) { return a.b.p; }
271 // NEWABI-LABEL: define i8* @_ZN22deleted_by_member_copy3fooENS_1AE(%"struct.deleted_by_member_copy::A"*
272 // OLDABI-LABEL: define i8* @_ZN22deleted_by_member_copy3fooENS_1AE(i8*
273 // WIN64-LABEL: define dso_local i8* @"?foo@deleted_by_member_copy@@YAPEAXUA@1@@Z"(%"struct.deleted_by_member_copy::A"*
276 namespace deleted_by_base_copy {
279 B(const B &o) = delete;
285 void *foo(A a) { return a.p; }
286 // NEWABI-LABEL: define i8* @_ZN20deleted_by_base_copy3fooENS_1AE(%"struct.deleted_by_base_copy::A"*
287 // OLDABI-LABEL: define i8* @_ZN20deleted_by_base_copy3fooENS_1AE(i8*
288 // WIN64-LABEL: define dso_local i8* @"?foo@deleted_by_base_copy@@YAPEAXUA@1@@Z"(%"struct.deleted_by_base_copy::A"*
291 namespace explicit_delete {
294 A(const A &o) = delete;
297 // NEWABI-LABEL: define i8* @_ZN15explicit_delete3fooENS_1AE(%"struct.explicit_delete::A"*
298 // OLDABI-LABEL: define i8* @_ZN15explicit_delete3fooENS_1AE(i8*
299 // WIN64-LABEL: define dso_local i8* @"?foo@explicit_delete@@YAPEAXUA@1@@Z"(%"struct.explicit_delete::A"*
300 void *foo(A a) { return a.p; }
303 namespace implicitly_deleted_copy_ctor {
305 // No move ctor due to copy assignment.
306 A &operator=(const A&);
307 // Deleted copy ctor due to rvalue ref member.
310 // NEWABI-LABEL: define {{.*}} @_ZN28implicitly_deleted_copy_ctor3fooENS_1AE(%"struct.implicitly_deleted_copy_ctor::A"*
311 // OLDABI-LABEL: define {{.*}} @_ZN28implicitly_deleted_copy_ctor3fooENS_1AE(i32*
312 // WIN64-LABEL: define {{.*}} @"?foo@implicitly_deleted_copy_ctor@@YAAEAHUA@1@@Z"(%"struct.implicitly_deleted_copy_ctor::A"*
313 int &foo(A a) { return a.ref; }
316 // Passed direct: has non-deleted trivial copy ctor.
317 B &operator=(const B&);
320 int &foo(B b) { return b.ref; }
321 // CHECK-LABEL: define {{.*}} @_ZN28implicitly_deleted_copy_ctor3fooENS_1BE(i32*
322 // WIN64-LABEL: define {{.*}} @"?foo@implicitly_deleted_copy_ctor@@YAAEAHUB@1@@Z"(i64
324 struct X { X(const X&); };
325 struct Y { Y(const Y&) = default; };
328 C &operator=(const C&);
329 // Passed indirect: copy ctor deleted due to variant member with nontrivial copy ctor.
333 int foo(C c) { return c.n; }
334 // CHECK-LABEL: define {{.*}} @_ZN28implicitly_deleted_copy_ctor3fooENS_1CE(%"union.implicitly_deleted_copy_ctor::C"*
335 // WIN64-LABEL: define {{.*}} @"?foo@implicitly_deleted_copy_ctor@@YAHTC@1@@Z"(%"union.implicitly_deleted_copy_ctor::C"*
338 D &operator=(const D&);
339 // Passed indirect: copy ctor deleted due to variant member with nontrivial copy ctor.
345 int foo(D d) { return d.n; }
346 // CHECK-LABEL: define {{.*}} @_ZN28implicitly_deleted_copy_ctor3fooENS_1DE(%"struct.implicitly_deleted_copy_ctor::D"*
347 // WIN64-LABEL: define {{.*}} @"?foo@implicitly_deleted_copy_ctor@@YAHUD@1@@Z"(%"struct.implicitly_deleted_copy_ctor::D"*
350 // Passed direct: has non-deleted trivial copy ctor.
351 E &operator=(const E&);
355 int foo(E e) { return e.n; }
356 // CHECK-LABEL: define {{.*}} @_ZN28implicitly_deleted_copy_ctor3fooENS_1EE(i32
357 // WIN64-LABEL: define {{.*}} @"?foo@implicitly_deleted_copy_ctor@@YAHTE@1@@Z"(i32
360 // Passed direct: has non-deleted trivial copy ctor.
361 F &operator=(const F&);
367 int foo(F f) { return f.n; }
368 // CHECK-LABEL: define {{.*}} @_ZN28implicitly_deleted_copy_ctor3fooENS_1FE(i32
369 // WIN64-LABEL: define {{.*}} @"?foo@implicitly_deleted_copy_ctor@@YAHUF@1@@Z"(i32