xref: /aosp_15_r20/external/clang/test/CodeGenCXX/copy-assign-synthesis-1.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -triple x86_64-apple-darwin -std=c++11 -emit-llvm %s -o - | \
2*67e74705SXin Li // RUN: FileCheck %s
3*67e74705SXin Li // RUN: %clang_cc1 -triple i386-apple-darwin -std=c++11 -emit-llvm %s -o - | \
4*67e74705SXin Li // RUN: FileCheck %s
5*67e74705SXin Li 
6*67e74705SXin Li extern "C" int printf(...);
7*67e74705SXin Li 
8*67e74705SXin Li struct B {
BB9*67e74705SXin Li   B() : B1(3.14), B2(3.15), auB2(3.16)  {}
10*67e74705SXin Li   float B1;
11*67e74705SXin Li   float B2;
prB12*67e74705SXin Li   void pr() {
13*67e74705SXin Li     printf("B1 = %f B2 = %f auB1 = %f\n", B1, B2, auB1);
14*67e74705SXin Li   }
15*67e74705SXin Li 
operator =B16*67e74705SXin Li   B& operator=(const B& arg) { B1 = arg.B1; B2 = arg.B2;
17*67e74705SXin Li                                auB1 = arg.auB1; return *this; }
18*67e74705SXin Li   union {
19*67e74705SXin Li     float auB1;
20*67e74705SXin Li     float auB2;
21*67e74705SXin Li   };
22*67e74705SXin Li };
23*67e74705SXin Li 
24*67e74705SXin Li struct M {
MM25*67e74705SXin Li   M() : M1(10), M2(11) , auM1(12) {}
26*67e74705SXin Li   int M1;
27*67e74705SXin Li   int M2;
prM28*67e74705SXin Li   void pr() {
29*67e74705SXin Li     printf("M1 = %d M2 = %d auM1 = %d auM2 = %d\n", M1, M2, auM1, auM2);
30*67e74705SXin Li   }
31*67e74705SXin Li   union {
32*67e74705SXin Li     int auM1;
33*67e74705SXin Li     int auM2;
34*67e74705SXin Li   };
35*67e74705SXin Li };
36*67e74705SXin Li 
37*67e74705SXin Li struct N  : B {
NN38*67e74705SXin Li   N() : N1(20), N2(21) {}
39*67e74705SXin Li   int N1;
40*67e74705SXin Li   int N2;
prN41*67e74705SXin Li   void pr() {
42*67e74705SXin Li     printf("N1 = %d N2 = %d\n", N1, N2);
43*67e74705SXin Li     for (unsigned i = 0; i < 3; i++)
44*67e74705SXin Li       for (unsigned j = 0; j < 2; j++)
45*67e74705SXin Li         printf("arr_b[%d][%d] = %f\n", i,j,arr_b[i][j].B1);
46*67e74705SXin Li     B::pr();
47*67e74705SXin Li   }
operator =N48*67e74705SXin Li   N& operator=(const N& arg) {
49*67e74705SXin Li     N1 = arg.N1; N2 = arg.N2;
50*67e74705SXin Li     for (unsigned i = 0; i < 3; i++)
51*67e74705SXin Li       for (unsigned j = 0; j < 2; j++)
52*67e74705SXin Li         arr_b[i][j] = arg.arr_b[i][j];
53*67e74705SXin Li     return *this;
54*67e74705SXin Li   }
55*67e74705SXin Li   B arr_b[3][2];
56*67e74705SXin Li };
57*67e74705SXin Li 
58*67e74705SXin Li struct Q  : B {
QQ59*67e74705SXin Li   Q() : Q1(30), Q2(31) {}
60*67e74705SXin Li   int Q1;
61*67e74705SXin Li   int Q2;
prQ62*67e74705SXin Li   void pr() {
63*67e74705SXin Li     printf("Q1 = %d Q2 = %d\n", Q1, Q2);
64*67e74705SXin Li   }
65*67e74705SXin Li };
66*67e74705SXin Li 
67*67e74705SXin Li 
68*67e74705SXin Li struct X : M , N {
XX69*67e74705SXin Li   X() : d(0.0), d1(1.1), d2(1.2), d3(1.3) {}
70*67e74705SXin Li   double d;
71*67e74705SXin Li   double d1;
72*67e74705SXin Li   double d2;
73*67e74705SXin Li   double d3;
prX74*67e74705SXin Li   void pr() {
75*67e74705SXin Li     printf("d = %f d1 = %f d2 = %f d3 = %f\n", d, d1,d2,d3);
76*67e74705SXin Li     M::pr(); N::pr();
77*67e74705SXin Li     q1.pr(); q2.pr();
78*67e74705SXin Li   }
79*67e74705SXin Li 
80*67e74705SXin Li  Q q1, q2;
81*67e74705SXin Li };
82*67e74705SXin Li 
83*67e74705SXin Li 
84*67e74705SXin Li X srcX;
85*67e74705SXin Li X dstX;
86*67e74705SXin Li X dstY;
87*67e74705SXin Li 
main()88*67e74705SXin Li int main() {
89*67e74705SXin Li   dstY = dstX = srcX;
90*67e74705SXin Li   srcX.pr();
91*67e74705SXin Li   dstX.pr();
92*67e74705SXin Li   dstY.pr();
93*67e74705SXin Li }
94*67e74705SXin Li 
95*67e74705SXin Li // CHECK: define linkonce_odr dereferenceable({{[0-9]+}}) %struct.X* @_ZN1XaSERKS_
96