125 lines
2.7 KiB
Plaintext
125 lines
2.7 KiB
Plaintext
|
// 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
|
||
|
// RUN: %clang_cc1 -x c++ -emit-llvm -triple x86_64-apple-darwin10.0.0 -o - %s | FileCheck %s -check-prefix=CHECK-CPP
|
||
|
#ifdef __OBJC__
|
||
|
struct A {
|
||
|
A &operator=(const A&);
|
||
|
A &operator=(A&);
|
||
|
};
|
||
|
|
||
|
struct B {
|
||
|
B &operator=(B&);
|
||
|
};
|
||
|
|
||
|
struct C {
|
||
|
virtual C& operator=(const C&);
|
||
|
};
|
||
|
|
||
|
struct POD {
|
||
|
id myobjc;
|
||
|
int array[3][4];
|
||
|
};
|
||
|
|
||
|
struct CopyByValue {
|
||
|
CopyByValue(const CopyByValue&);
|
||
|
CopyByValue &operator=(CopyByValue);
|
||
|
};
|
||
|
|
||
|
struct D : A, B, virtual C {
|
||
|
int scalar;
|
||
|
int scalar_array[2][3];
|
||
|
B class_member;
|
||
|
C class_member_array[2][3];
|
||
|
POD pod_array[2][3];
|
||
|
|
||
|
union {
|
||
|
int x;
|
||
|
float f[3];
|
||
|
};
|
||
|
|
||
|
CopyByValue by_value;
|
||
|
};
|
||
|
|
||
|
void test_D(D d1, D d2) {
|
||
|
d1 = d2;
|
||
|
}
|
||
|
|
||
|
// CHECK-OBJ-LABEL: define linkonce_odr nonnull align {{[0-9]+}} dereferenceable({{[0-9]+}}) %struct.D* @_ZN1DaSERS_
|
||
|
// CHECK-OBJ: {{call.*_ZN1AaSERS_}}
|
||
|
// CHECK-OBJ: {{call.*_ZN1BaSERS_}}
|
||
|
// CHECK-OBJ: {{call.*_ZN1CaSERKS_}}
|
||
|
// CHECK-OBJ: {{call void @llvm.memcpy.p0i8.p0i8.i64.*i64 24}}
|
||
|
// CHECK-OBJ: {{call.*_ZN1BaSERS_}}
|
||
|
// CHECK-OBJ: br
|
||
|
// CHECK-OBJ: {{call.*_ZN1CaSERKS_}}
|
||
|
// CHECK-OBJ: {{call.*@objc_memmove_collectable}}
|
||
|
// CHECK-OBJ: {{call void @llvm.memcpy.p0i8.p0i8.i64.*i64 12}}
|
||
|
// CHECK-OBJ: call void @_ZN11CopyByValueC1ERKS_
|
||
|
// CHECK-OBJ: {{call.*_ZN11CopyByValueaSES_}}
|
||
|
// CHECK-OBJ: ret
|
||
|
#endif
|
||
|
|
||
|
namespace PR13329 {
|
||
|
#ifndef __OBJC__
|
||
|
typedef void* id;
|
||
|
#endif
|
||
|
struct POD {
|
||
|
id i;
|
||
|
short s;
|
||
|
};
|
||
|
|
||
|
struct NonPOD {
|
||
|
id i;
|
||
|
short s;
|
||
|
|
||
|
NonPOD();
|
||
|
};
|
||
|
|
||
|
struct DerivedNonPOD: NonPOD {
|
||
|
char c;
|
||
|
};
|
||
|
|
||
|
struct DerivedPOD: POD {
|
||
|
char c;
|
||
|
};
|
||
|
|
||
|
void testPOD() {
|
||
|
POD a;
|
||
|
POD b;
|
||
|
// CHECK-OBJ: @objc_memmove_collectable{{.*}}i64 16
|
||
|
// CHECK-CPP: @llvm.memcpy{{.*}}i64 16
|
||
|
b = a;
|
||
|
}
|
||
|
|
||
|
void testNonPOD() {
|
||
|
NonPOD a;
|
||
|
NonPOD b;
|
||
|
// CHECK-OBJ: @objc_memmove_collectable{{.*}}i64 10
|
||
|
// CHECK-CPP: @llvm.memcpy{{.*}}i64 10
|
||
|
b = a;
|
||
|
}
|
||
|
|
||
|
void testDerivedNonPOD() {
|
||
|
DerivedNonPOD a;
|
||
|
NonPOD b;
|
||
|
DerivedNonPOD c;
|
||
|
// CHECK-OBJ: @objc_memmove_collectable{{.*}}i64 10
|
||
|
// CHECK-CPP: @llvm.memcpy{{.*}}i64 10
|
||
|
(NonPOD&) a = b;
|
||
|
// CHECK-OBJ: @objc_memmove_collectable{{.*}}i64 11
|
||
|
// CHECK-CPP: @llvm.memcpy{{.*}}i64 11
|
||
|
a = c;
|
||
|
};
|
||
|
|
||
|
void testDerivedPOD() {
|
||
|
DerivedPOD a;
|
||
|
POD b;
|
||
|
DerivedPOD c;
|
||
|
// CHECK-OBJ: @objc_memmove_collectable{{.*}}i64 16
|
||
|
// CHECK-CPP: @llvm.memcpy{{.*}}i64 16
|
||
|
(POD&) a = b;
|
||
|
// CHECK-OBJ: @objc_memmove_collectable{{.*}}i64 17
|
||
|
// CHECK-CPP: @llvm.memcpy{{.*}}i64 17
|
||
|
a = c;
|
||
|
};
|
||
|
}
|