// RUN: %clang_cc1 %s -I%S -triple=x86_64-apple-darwin10 -emit-llvm -O3 -o - | FileCheck %s

// CHECK: %"struct.rdar20621065::B" = type { float, float }

struct Empty { };

struct A { 
  explicit A(unsigned a = 0xffffffff) : a(a) { }
  
  unsigned a;
};

struct B : A, Empty { 
  B() : A(), Empty() { }
};

struct C : A, Empty {
  C() : A(), Empty() { }
  C(const C& other) : A(0x12345678), Empty(other) { }
};

struct D : A, Empty {
  D& operator=(const D& other) {
    a = 0x87654321;
    Empty::operator=(other);
    
    return *this;
  }
};

#define CHECK(x) if (!(x)) return __LINE__

// PR7012
// CHECK-LABEL: define i32 @_Z1fv()
int f() {
  B b1;

  // Check that A::a is not overwritten by the Empty default constructor.
  CHECK(b1.a == 0xffffffff);
  
  C c1;
  C c2(c1);
  
  // Check that A::a has the value set in the C::C copy constructor.
  CHECK(c2.a == 0x12345678);
  
  D d1, d2;
  d2 = d1;

  // Check that A::as has the value set in the D copy assignment operator.
  CHECK(d2.a == 0x87654321);
  
  // Success!
  // CHECK: ret i32 0
  return 0;
}

namespace PR8796 {
  struct FreeCell {
  };
  union ThingOrCell {
    FreeCell t;
    FreeCell cell;
  };
  struct Things {
    ThingOrCell things;
  };
  Things x;
}

#ifdef HARNESS
extern "C" void printf(const char *, ...);

int main() {
  int result = f();
  
  if (result == 0)
    printf("success!\n");
  else
    printf("test on line %d failed!\n", result);

  return result;
}
#endif

namespace rdar20621065 {
  struct A {
    float array[0];
  };

  struct B : A {
    float left;
    float right;
  };

  // Type checked at the top of the file.
  B b;
};
