103 lines · cpp
1// RUN: %clang_cc1 %s -triple x86_64-apple-darwin10 -emit-llvm -o - | FileCheck %s2 3// An extra byte should be allocated for an empty class.4namespace Test1 {5 // CHECK: %"struct.Test1::A" = type { i8 }6 struct A { } a;7}8 9namespace Test2 {10 // No need to add tail padding here.11 // CHECK: %"struct.Test2::A" = type { ptr, i32 }12 struct A { void *a; int b; } a;13}14 15namespace Test3 {16 // C should have a vtable pointer.17 // CHECK: %"struct.Test3::A" = type <{ ptr, i32, [4 x i8] }>18 struct A { virtual void f(); int a; } a;19}20 21namespace Test4 {22 // Test from PR5589.23 // CHECK: %"struct.Test4::B" = type { %"struct.Test4::A", i16, double }24 // CHECK: %"struct.Test4::A" = type { i32, i8, float }25 struct A {26 int a;27 char c;28 float b;29 };30 struct B : public A {31 short d;32 double e;33 } b;34}35 36namespace Test5 {37 struct A {38 virtual void f();39 char a;40 };41 42 // CHECK: %"struct.Test5::B" = type { %"struct.Test5::A.base", i8, i8, [5 x i8] }43 struct B : A {44 char b : 1;45 char c;46 } b;47}48 49// PR10912: don't crash50namespace Test6 {51 template <typename T> class A {52 // If T is complete, IR-gen will want to translate it recursively53 // when translating T*.54 T *foo;55 };56 57 class B;58 59 // This causes IR-gen to have an incomplete translation of A<B>60 // sitting around.61 A<B> *a;62 63 class C {};64 class B : public C {65 // This forces Sema to instantiate A<B>, which triggers a callback66 // to IR-gen. Because of the previous, incomplete translation,67 // IR-gen actually cares, and it immediately tries to complete68 // A<B>'s IR type. That, in turn, causes the translation of B*.69 // B isn't complete yet, but it has a definition, and if we try to70 // compute a record layout for that definition then we'll really71 // regret it later.72 A<B> a;73 };74 75 // The derived class E and empty base class C are required to76 // provoke the original assertion.77 class E : public B {};78 E *e;79}80 81// Make sure this doesn't crash. (It's okay if we start rejecting it at some82// point.)83namespace Test7 {84 #pragma pack (1)85 class A {};86 // CHECK: %"class.Test7::B" = type <{ ptr, i8 }>87 class B {88 virtual ~B();89 A a;90 };91 B test(B b) { return b; }92 #pragma pack ()93}94 95// Shouldn't crash.96namespace Test8 {97 struct A {};98 struct D { int a; };99 struct B : virtual D, A { };100 struct C : B, A { void f() {} };101 C c;102}103