// RUN: %clang_cc1 -triple x86_64-apple-darwin -std=c++0x -S %s -o %t-64.s
// RUN: FileCheck -check-prefix LP64 --input-file=%t-64.s %s
// RUN: %clang_cc1 -triple i386-apple-darwin -std=c++0x -S %s -o %t-32.s
// RUN: FileCheck -check-prefix LP32 --input-file=%t-32.s %s

extern "C" int printf(...);

struct B {
  B() : B1(3.14), B2(3.15), auB2(3.16)  {} 
  float B1;
  float B2;
  void pr() {
    printf("B1 = %f B2 = %f auB1 = %f\n", B1, B2, auB1);
  }

  B& operator=(const B& arg) { B1 = arg.B1; B2 = arg.B2; 
                               auB1 = arg.auB1; return *this; }
  union {
    float auB1;
    float auB2;
  };
};

struct M {
  M() : M1(10), M2(11) , auM1(12) {} 
  int M1;
  int M2;
  void pr() {
    printf("M1 = %d M2 = %d auM1 = %d auM2 = %d\n", M1, M2, auM1, auM2);
  }
  union {
    int auM1;
    int auM2;
  };
};

struct N  : B {
  N() : N1(20), N2(21) {} 
  int N1;
  int N2;
  void pr() {
    printf("N1 = %d N2 = %d\n", N1, N2);
    for (unsigned i = 0; i < 3; i++)
      for (unsigned j = 0; j < 2; j++)
        printf("arr_b[%d][%d] = %f\n", i,j,arr_b[i][j].B1);
    B::pr();
  }
  N& operator=(const N& arg) {
    N1 = arg.N1; N2 = arg.N2; 
    for (unsigned i = 0; i < 3; i++)
      for (unsigned j = 0; j < 2; j++)
        arr_b[i][j] = arg.arr_b[i][j];
    return *this;
  }
  B arr_b[3][2];
};

struct Q  : B {
  Q() : Q1(30), Q2(31) {} 
  int Q1;
  int Q2;
  void pr() {
    printf("Q1 = %d Q2 = %d\n", Q1, Q2);
  }
};


struct X : M , N { 
  X() : d(0.0), d1(1.1), d2(1.2), d3(1.3) {}
  double d;
  double d1;
  double d2;
  double d3;
  void pr() {
    printf("d = %f d1 = %f d2 = %f d3 = %f\n", d, d1,d2,d3);
    M::pr(); N::pr();
    q1.pr(); q2.pr();
  }

 Q q1, q2;
}; 


X srcX; 
X dstX; 
X dstY; 

int main() {
  dstY = dstX = srcX;
  srcX.pr();
  dstX.pr();
  dstY.pr();
}

// CHECK-LP64: .globl   __ZN1XaSERKS_
// CHECK-LP64: .weak_definition  __ZN1XaSERKS_
// CHECK-LP64: __ZN1XaSERKS_:
// CHECK-LP64: .globl   __ZN1QaSERKS_
// CHECK-LP64: .weak_definition  __ZN1QaSERKS_
// CHECK-LP64: __ZN1QaSERKS_:

// CHECK-LP32: .globl   __ZN1XaSERKS_
// CHECK-LP32: .weak_definition  __ZN1XaSERKS_
// CHECK-LP32: __ZN1XaSERKS_:
// CHECK-LP32: .globl   __ZN1QaSERKS_
// CHECK-LP32: .weak_definition  __ZN1QaSERKS_
// CHECK-LP32: __ZN1QaSERKS_:

