1 | // RUN: %clang_cc1 -fobjc-gc -emit-llvm -triple x86_64-apple-darwin10.0.0 -fobjc-runtime=macosx-fragile-10.5 -o - %s | FileCheck %s -check-prefix=CHECK-OBJ |
2 | // RUN: %clang_cc1 -x c++ -emit-llvm -triple x86_64-apple-darwin10.0.0 -o - %s | FileCheck %s -check-prefix=CHECK-CPP |
3 | #ifdef __OBJC__ |
4 | struct A { |
5 | A &operator=(const A&); |
6 | A &operator=(A&); |
7 | }; |
8 | |
9 | struct B { |
10 | B &operator=(B&); |
11 | }; |
12 | |
13 | struct C { |
14 | virtual C& operator=(const C&); |
15 | }; |
16 | |
17 | struct POD { |
18 | id myobjc; |
19 | int array[3][4]; |
20 | }; |
21 | |
22 | struct CopyByValue { |
23 | CopyByValue(const CopyByValue&); |
24 | CopyByValue &operator=(CopyByValue); |
25 | }; |
26 | |
27 | struct D : A, B, virtual C { |
28 | int scalar; |
29 | int scalar_array[2][3]; |
30 | B class_member; |
31 | C class_member_array[2][3]; |
32 | POD pod_array[2][3]; |
33 | |
34 | union { |
35 | int x; |
36 | float f[3]; |
37 | }; |
38 | |
39 | CopyByValue by_value; |
40 | }; |
41 | |
42 | void test_D(D d1, D d2) { |
43 | d1 = d2; |
44 | } |
45 | |
46 | // CHECK-OBJ-LABEL: define linkonce_odr dereferenceable({{[0-9]+}}) %struct.D* @_ZN1DaSERS_ |
47 | // CHECK-OBJ: {{call.*_ZN1AaSERS_}} |
48 | // CHECK-OBJ: {{call.*_ZN1BaSERS_}} |
49 | // CHECK-OBJ: {{call.*_ZN1CaSERKS_}} |
50 | // CHECK-OBJ: {{call void @llvm.memcpy.p0i8.p0i8.i64.*i64 24}} |
51 | // CHECK-OBJ: {{call.*_ZN1BaSERS_}} |
52 | // CHECK-OBJ: br |
53 | // CHECK-OBJ: {{call.*_ZN1CaSERKS_}} |
54 | // CHECK-OBJ: {{call.*@objc_memmove_collectable}} |
55 | // CHECK-OBJ: {{call void @llvm.memcpy.p0i8.p0i8.i64.*i64 12}} |
56 | // CHECK-OBJ: call void @_ZN11CopyByValueC1ERKS_ |
57 | // CHECK-OBJ: {{call.*_ZN11CopyByValueaSES_}} |
58 | // CHECK-OBJ: ret |
59 | #endif |
60 | |
61 | namespace PR13329 { |
62 | #ifndef __OBJC__ |
63 | typedef void* id; |
64 | #endif |
65 | struct POD { |
66 | id i; |
67 | short s; |
68 | }; |
69 | |
70 | struct NonPOD { |
71 | id i; |
72 | short s; |
73 | |
74 | NonPOD(); |
75 | }; |
76 | |
77 | struct DerivedNonPOD: NonPOD { |
78 | char c; |
79 | }; |
80 | |
81 | struct DerivedPOD: POD { |
82 | char c; |
83 | }; |
84 | |
85 | void testPOD() { |
86 | POD a; |
87 | POD b; |
88 | // CHECK-OBJ: @objc_memmove_collectable{{.*}}i64 16 |
89 | // CHECK-CPP: @llvm.memcpy{{.*}}i64 16 |
90 | b = a; |
91 | } |
92 | |
93 | void testNonPOD() { |
94 | NonPOD a; |
95 | NonPOD b; |
96 | // CHECK-OBJ: @objc_memmove_collectable{{.*}}i64 10 |
97 | // CHECK-CPP: @llvm.memcpy{{.*}}i64 10 |
98 | b = a; |
99 | } |
100 | |
101 | void testDerivedNonPOD() { |
102 | DerivedNonPOD a; |
103 | NonPOD b; |
104 | DerivedNonPOD c; |
105 | // CHECK-OBJ: @objc_memmove_collectable{{.*}}i64 10 |
106 | // CHECK-CPP: @llvm.memcpy{{.*}}i64 10 |
107 | (NonPOD&) a = b; |
108 | // CHECK-OBJ: @objc_memmove_collectable{{.*}}i64 11 |
109 | // CHECK-CPP: @llvm.memcpy{{.*}}i64 11 |
110 | a = c; |
111 | }; |
112 | |
113 | void testDerivedPOD() { |
114 | DerivedPOD a; |
115 | POD b; |
116 | DerivedPOD c; |
117 | // CHECK-OBJ: @objc_memmove_collectable{{.*}}i64 16 |
118 | // CHECK-CPP: @llvm.memcpy{{.*}}i64 16 |
119 | (POD&) a = b; |
120 | // CHECK-OBJ: @objc_memmove_collectable{{.*}}i64 17 |
121 | // CHECK-CPP: @llvm.memcpy{{.*}}i64 17 |
122 | a = c; |
123 | }; |
124 | } |
125 | |