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