// RUN: %clang_cc1 -no-opaque-pointers %s -triple x86_64-apple-darwin10 -emit-llvm -o - | FileCheck %s

// An extra byte should be allocated for an empty class.
namespace Test1 {
  // CHECK: %"struct.Test1::A" = type { i8 }
  struct A { } *a;
}

namespace Test2 {
  // No need to add tail padding here.
  // CHECK: %"struct.Test2::A" = type { i8*, i32 }
  struct A { void *a; int b; } *a;
}

namespace Test3 {
  // C should have a vtable pointer.
  // CHECK: %"struct.Test3::A" = type <{ i32 (...)**, i32, [4 x i8] }>
  struct A { virtual void f(); int a; } *a;
}

namespace Test4 {
  // Test from PR5589.
  // CHECK: %"struct.Test4::B" = type { %"struct.Test4::A", i16, double }
  // CHECK: %"struct.Test4::A" = type { i32, i8, float }
  struct A {
    int a;
    char c;
    float b;
  };
  struct B : public A {
    short d;
    double e;
  } *b;
}

namespace Test5 {
  struct A {
    virtual void f();
    char a;
  };

  // CHECK: %"struct.Test5::B" = type {  %"struct.Test5::A.base", i8, i8, [5 x i8] }
  struct B : A {
    char b : 1;
    char c;
  } *b;
}

// PR10912: don't crash
namespace Test6 {
  template <typename T> class A {
    // If T is complete, IR-gen will want to translate it recursively
    // when translating T*.
    T *foo;
  };

  class B;

  // This causes IR-gen to have an incomplete translation of A<B>
  // sitting around.
  A<B> *a;

  class C {};
  class B : public C {
    // This forces Sema to instantiate A<B>, which triggers a callback
    // to IR-gen.  Because of the previous, incomplete translation,
    // IR-gen actually cares, and it immediately tries to complete
    // A<B>'s IR type.  That, in turn, causes the translation of B*.
    // B isn't complete yet, but it has a definition, and if we try to
    // compute a record layout for that definition then we'll really
    // regret it later.
    A<B> a;
  };

  // The derived class E and empty base class C are required to
  // provoke the original assertion.
  class E : public B {};
  E *e;
}

// <rdar://problem/11324125>: Make sure this doesn't crash.  (It's okay
// if we start rejecting it at some point.)
namespace Test7 {
  #pragma pack (1)
  class A {};
  // CHECK: %"class.Test7::B" = type <{ i32 (...)**, %"class.Test7::A" }>
  class B {
     virtual ~B();
     A a;
  };
  B* b;
  #pragma pack ()
}

// Shouldn't crash.
namespace Test8 {
  struct A {};
  struct D { int a; };
  struct B : virtual D, A { };
  struct C : B, A { void f() {} };
  C c;
}
