1560bf12e97773ba19e55382c32f8b64cd8315315Anders Carlsson// RUN: %clang_cc1 %s -triple x86_64-apple-darwin10 -emit-llvm -o - | FileCheck %s
2696798febaf1f69020cdf7474b91e71736c5aa69Anders Carlsson
368e3013ade8a219625b636bb8c1dcec2ba6fb685Anders Carlsson// An extra byte should be allocated for an empty class.
4560bf12e97773ba19e55382c32f8b64cd8315315Anders Carlssonnamespace Test1 {
5560bf12e97773ba19e55382c32f8b64cd8315315Anders Carlsson  // CHECK: %"struct.Test1::A" = type { i8 }
6560bf12e97773ba19e55382c32f8b64cd8315315Anders Carlsson  struct A { } *a;
7560bf12e97773ba19e55382c32f8b64cd8315315Anders Carlsson}
8c2456824a106455bae5d738fe65d80b14a6804c4Anders Carlsson
9560bf12e97773ba19e55382c32f8b64cd8315315Anders Carlssonnamespace Test2 {
10560bf12e97773ba19e55382c32f8b64cd8315315Anders Carlsson  // No need to add tail padding here.
11560bf12e97773ba19e55382c32f8b64cd8315315Anders Carlsson  // CHECK: %"struct.Test2::A" = type { i8*, i32 }
12560bf12e97773ba19e55382c32f8b64cd8315315Anders Carlsson  struct A { void *a; int b; } *a;
13560bf12e97773ba19e55382c32f8b64cd8315315Anders Carlsson}
144b3e5be334c93c3f48af2a49c0ea7cd9bae2a0e5Anders Carlsson
15560bf12e97773ba19e55382c32f8b64cd8315315Anders Carlssonnamespace Test3 {
16560bf12e97773ba19e55382c32f8b64cd8315315Anders Carlsson  // C should have a vtable pointer.
17560bf12e97773ba19e55382c32f8b64cd8315315Anders Carlsson  // CHECK: %"struct.Test3::A" = type { i32 (...)**, i32 }
18560bf12e97773ba19e55382c32f8b64cd8315315Anders Carlsson  struct A { virtual void f(); int a; } *a;
19560bf12e97773ba19e55382c32f8b64cd8315315Anders Carlsson}
20eb9d81dff99d4996f41c93ce71b08aaf753cbae8Anders Carlsson
21eb9d81dff99d4996f41c93ce71b08aaf753cbae8Anders Carlssonnamespace Test4 {
22eb9d81dff99d4996f41c93ce71b08aaf753cbae8Anders Carlsson  // Test from PR5589.
23eb9d81dff99d4996f41c93ce71b08aaf753cbae8Anders Carlsson  // CHECK: %"struct.Test4::B" = type { %"struct.Test4::A", i16, double }
249cbe4f0ba01ec304e1e3d071c071f7bca33631c0Chris Lattner  // CHECK: %"struct.Test4::A" = type { i32, i8, float }
25eb9d81dff99d4996f41c93ce71b08aaf753cbae8Anders Carlsson  struct A {
26eb9d81dff99d4996f41c93ce71b08aaf753cbae8Anders Carlsson    int a;
27eb9d81dff99d4996f41c93ce71b08aaf753cbae8Anders Carlsson    char c;
28eb9d81dff99d4996f41c93ce71b08aaf753cbae8Anders Carlsson    float b;
29eb9d81dff99d4996f41c93ce71b08aaf753cbae8Anders Carlsson  };
30eb9d81dff99d4996f41c93ce71b08aaf753cbae8Anders Carlsson  struct B : public A {
31eb9d81dff99d4996f41c93ce71b08aaf753cbae8Anders Carlsson    short d;
32eb9d81dff99d4996f41c93ce71b08aaf753cbae8Anders Carlsson    double e;
33eb9d81dff99d4996f41c93ce71b08aaf753cbae8Anders Carlsson  } *b;
34eb9d81dff99d4996f41c93ce71b08aaf753cbae8Anders Carlsson}
35eb9d81dff99d4996f41c93ce71b08aaf753cbae8Anders Carlsson
36eb9d81dff99d4996f41c93ce71b08aaf753cbae8Anders Carlssonnamespace Test5 {
37eb9d81dff99d4996f41c93ce71b08aaf753cbae8Anders Carlsson  struct A {
38eb9d81dff99d4996f41c93ce71b08aaf753cbae8Anders Carlsson    virtual void f();
39eb9d81dff99d4996f41c93ce71b08aaf753cbae8Anders Carlsson    char a;
40eb9d81dff99d4996f41c93ce71b08aaf753cbae8Anders Carlsson  };
41eb9d81dff99d4996f41c93ce71b08aaf753cbae8Anders Carlsson
42651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // CHECK: %"struct.Test5::B" = type {  %"struct.Test5::A.base", i8, i8, [5 x i8] }
43eb9d81dff99d4996f41c93ce71b08aaf753cbae8Anders Carlsson  struct B : A {
44eb9d81dff99d4996f41c93ce71b08aaf753cbae8Anders Carlsson    char b : 1;
45eb9d81dff99d4996f41c93ce71b08aaf753cbae8Anders Carlsson    char c;
46eb9d81dff99d4996f41c93ce71b08aaf753cbae8Anders Carlsson  } *b;
47eb9d81dff99d4996f41c93ce71b08aaf753cbae8Anders Carlsson}
486595935602f57b4f2115785bb39dabc83e4232dcJohn McCall
496595935602f57b4f2115785bb39dabc83e4232dcJohn McCall// PR10912: don't crash
506595935602f57b4f2115785bb39dabc83e4232dcJohn McCallnamespace Test6 {
516595935602f57b4f2115785bb39dabc83e4232dcJohn McCall  template <typename T> class A {
526595935602f57b4f2115785bb39dabc83e4232dcJohn McCall    // If T is complete, IR-gen will want to translate it recursively
536595935602f57b4f2115785bb39dabc83e4232dcJohn McCall    // when translating T*.
546595935602f57b4f2115785bb39dabc83e4232dcJohn McCall    T *foo;
556595935602f57b4f2115785bb39dabc83e4232dcJohn McCall  };
566595935602f57b4f2115785bb39dabc83e4232dcJohn McCall
576595935602f57b4f2115785bb39dabc83e4232dcJohn McCall  class B;
586595935602f57b4f2115785bb39dabc83e4232dcJohn McCall
596595935602f57b4f2115785bb39dabc83e4232dcJohn McCall  // This causes IR-gen to have an incomplete translation of A<B>
606595935602f57b4f2115785bb39dabc83e4232dcJohn McCall  // sitting around.
616595935602f57b4f2115785bb39dabc83e4232dcJohn McCall  A<B> *a;
626595935602f57b4f2115785bb39dabc83e4232dcJohn McCall
636595935602f57b4f2115785bb39dabc83e4232dcJohn McCall  class C {};
646595935602f57b4f2115785bb39dabc83e4232dcJohn McCall  class B : public C {
656595935602f57b4f2115785bb39dabc83e4232dcJohn McCall    // This forces Sema to instantiate A<B>, which triggers a callback
666595935602f57b4f2115785bb39dabc83e4232dcJohn McCall    // to IR-gen.  Because of the previous, incomplete translation,
676595935602f57b4f2115785bb39dabc83e4232dcJohn McCall    // IR-gen actually cares, and it immediately tries to complete
686595935602f57b4f2115785bb39dabc83e4232dcJohn McCall    // A<B>'s IR type.  That, in turn, causes the translation of B*.
696595935602f57b4f2115785bb39dabc83e4232dcJohn McCall    // B isn't complete yet, but it has a definition, and if we try to
706595935602f57b4f2115785bb39dabc83e4232dcJohn McCall    // compute a record layout for that definition then we'll really
716595935602f57b4f2115785bb39dabc83e4232dcJohn McCall    // regret it later.
726595935602f57b4f2115785bb39dabc83e4232dcJohn McCall    A<B> a;
736595935602f57b4f2115785bb39dabc83e4232dcJohn McCall  };
746595935602f57b4f2115785bb39dabc83e4232dcJohn McCall
756595935602f57b4f2115785bb39dabc83e4232dcJohn McCall  // The derived class E and empty base class C are required to
766595935602f57b4f2115785bb39dabc83e4232dcJohn McCall  // provoke the original assertion.
776595935602f57b4f2115785bb39dabc83e4232dcJohn McCall  class E : public B {};
786595935602f57b4f2115785bb39dabc83e4232dcJohn McCall  E *e;
796595935602f57b4f2115785bb39dabc83e4232dcJohn McCall}
80c8f11e9b4b627a85aa83f74474327254d958cf8dEli Friedman
81c8f11e9b4b627a85aa83f74474327254d958cf8dEli Friedman// <rdar://problem/11324125>: Make sure this doesn't crash.  (It's okay
82c8f11e9b4b627a85aa83f74474327254d958cf8dEli Friedman// if we start rejecting it at some point.)
83c8f11e9b4b627a85aa83f74474327254d958cf8dEli Friedmannamespace Test7 {
84c8f11e9b4b627a85aa83f74474327254d958cf8dEli Friedman  #pragma pack (1)
85c8f11e9b4b627a85aa83f74474327254d958cf8dEli Friedman  class A {};
86c8f11e9b4b627a85aa83f74474327254d958cf8dEli Friedman  // CHECK: %"class.Test7::B" = type <{ i32 (...)**, %"class.Test7::A" }>
87c8f11e9b4b627a85aa83f74474327254d958cf8dEli Friedman  class B {
88c8f11e9b4b627a85aa83f74474327254d958cf8dEli Friedman     virtual ~B();
89c8f11e9b4b627a85aa83f74474327254d958cf8dEli Friedman     A a;
90c8f11e9b4b627a85aa83f74474327254d958cf8dEli Friedman  };
91c8f11e9b4b627a85aa83f74474327254d958cf8dEli Friedman  B* b;
92c8f11e9b4b627a85aa83f74474327254d958cf8dEli Friedman  #pragma pack ()
93c8f11e9b4b627a85aa83f74474327254d958cf8dEli Friedman}
946bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
956bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// Shouldn't crash.
966bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesnamespace Test8 {
97ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  struct A {};
98ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  struct D { int a; };
99ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  struct B : virtual D, A { };
100ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  struct C : B, A { void f() {} };
101ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  C c;
1026bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}
103