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