[clang] Handle __declspec() attributes in using
[llvm-project.git] / clang / test / CodeGenObjCXX / implicit-copy-assign-operator.mm
blob78520fa08a589bbc23ae7fa39019216b82b2dd56
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 };
9 struct B {
10   B &operator=(B&);
13 struct C {
14   virtual C& operator=(const C&);
17 struct POD {
18   id myobjc;
19   int array[3][4];
22 struct CopyByValue {
23   CopyByValue(const CopyByValue&);
24   CopyByValue &operator=(CopyByValue);
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];
34   union {
35     int x;
36     float f[3];
37   };
39   CopyByValue by_value;
42 void test_D(D d1, D d2) {
43   d1 = d2;
46 // CHECK-OBJ-LABEL: define linkonce_odr noundef nonnull align {{[0-9]+}} dereferenceable({{[0-9]+}}) ptr @_ZN1DaSERS_
47 // CHECK-OBJ: {{call.*_ZN1AaSERS_}}
48 // CHECK-OBJ: {{call.*_ZN1BaSERS_}}
49 // CHECK-OBJ: {{call.*_ZN1CaSERKS_}}
50 // CHECK-OBJ: {{call void @llvm.memcpy.p0.p0.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.p0.p0.i64.*i64 12}}
56 // CHECK-OBJ: call void @_ZN11CopyByValueC1ERKS_
57 // CHECK-OBJ: {{call.*_ZN11CopyByValueaSES_}}
58 // CHECK-OBJ: ret
59 #endif
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   };