class-layout.cpp revision c568f1e98938584c0ef0b12ae5018ff7d90a4072
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 { 97c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines struct A {}; 98c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines struct D { int a; }; 99c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines struct B : virtual D, A { }; 100c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines struct C : B, A { void f() {} }; 101c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines C c; 1026bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines} 103