120314fffcf5d97bab58686cdcb914637b453a166Anders Carlsson// RUN: %clang_cc1 %s -triple=x86_64-apple-darwin10 -emit-llvm -o - | FileCheck %s
220314fffcf5d97bab58686cdcb914637b453a166Anders Carlsson
335aa62aacf2b644f2ff2f0bdfd89136323698a39Anders Carlsson// Test1::B should just have a single entry in its VTT, which points to the vtable.
420314fffcf5d97bab58686cdcb914637b453a166Anders Carlssonnamespace Test1 {
520314fffcf5d97bab58686cdcb914637b453a166Anders Carlssonstruct A { };
620314fffcf5d97bab58686cdcb914637b453a166Anders Carlsson
720314fffcf5d97bab58686cdcb914637b453a166Anders Carlssonstruct B : virtual A {
820314fffcf5d97bab58686cdcb914637b453a166Anders Carlsson  virtual void f();
920314fffcf5d97bab58686cdcb914637b453a166Anders Carlsson};
1020314fffcf5d97bab58686cdcb914637b453a166Anders Carlsson
1120314fffcf5d97bab58686cdcb914637b453a166Anders Carlssonvoid B::f() { }
1220314fffcf5d97bab58686cdcb914637b453a166Anders Carlsson}
1320314fffcf5d97bab58686cdcb914637b453a166Anders Carlsson
1435aa62aacf2b644f2ff2f0bdfd89136323698a39Anders Carlsson// Check that we don't add a secondary virtual pointer for Test2::A, since Test2::A doesn't have any virtual member functions or bases.
1520314fffcf5d97bab58686cdcb914637b453a166Anders Carlssonnamespace Test2 {
1620314fffcf5d97bab58686cdcb914637b453a166Anders Carlsson  struct A { };
1720314fffcf5d97bab58686cdcb914637b453a166Anders Carlsson
1820314fffcf5d97bab58686cdcb914637b453a166Anders Carlsson  struct B : A { virtual void f(); };
1920314fffcf5d97bab58686cdcb914637b453a166Anders Carlsson  struct C : virtual B { };
2020314fffcf5d97bab58686cdcb914637b453a166Anders Carlsson
2120314fffcf5d97bab58686cdcb914637b453a166Anders Carlsson  C c;
2220314fffcf5d97bab58686cdcb914637b453a166Anders Carlsson}
2320314fffcf5d97bab58686cdcb914637b453a166Anders Carlsson
2435aa62aacf2b644f2ff2f0bdfd89136323698a39Anders Carlsson// This is the sample from the C++ Itanium ABI, p2.6.2.
2535aa62aacf2b644f2ff2f0bdfd89136323698a39Anders Carlssonnamespace Test3 {
2635aa62aacf2b644f2ff2f0bdfd89136323698a39Anders Carlsson  class A1 { int i; };
2735aa62aacf2b644f2ff2f0bdfd89136323698a39Anders Carlsson  class A2 { int i; virtual void f(); };
2835aa62aacf2b644f2ff2f0bdfd89136323698a39Anders Carlsson  class V1 : public A1, public A2 { int i; };
2935aa62aacf2b644f2ff2f0bdfd89136323698a39Anders Carlsson  class B1 { int i; };
3035aa62aacf2b644f2ff2f0bdfd89136323698a39Anders Carlsson  class B2 { int i; };
3135aa62aacf2b644f2ff2f0bdfd89136323698a39Anders Carlsson  class V2 : public B1, public B2, public virtual V1 { int i; };
3235aa62aacf2b644f2ff2f0bdfd89136323698a39Anders Carlsson  class V3 {virtual void g(); };
3335aa62aacf2b644f2ff2f0bdfd89136323698a39Anders Carlsson  class C1 : public virtual V1 { int i; };
3435aa62aacf2b644f2ff2f0bdfd89136323698a39Anders Carlsson  class C2 : public virtual V3, virtual V2 { int i; };
3535aa62aacf2b644f2ff2f0bdfd89136323698a39Anders Carlsson  class X1 { int i; };
3635aa62aacf2b644f2ff2f0bdfd89136323698a39Anders Carlsson  class C3 : public X1 { int i; };
3735aa62aacf2b644f2ff2f0bdfd89136323698a39Anders Carlsson  class D : public C1, public C2, public C3 { int i;  };
3835aa62aacf2b644f2ff2f0bdfd89136323698a39Anders Carlsson
3935aa62aacf2b644f2ff2f0bdfd89136323698a39Anders Carlsson  D d;
4035aa62aacf2b644f2ff2f0bdfd89136323698a39Anders Carlsson}
4135aa62aacf2b644f2ff2f0bdfd89136323698a39Anders Carlsson
4235aa62aacf2b644f2ff2f0bdfd89136323698a39Anders Carlsson// This is the sample from the C++ Itanium ABI, p2.6.2, with the change suggested
4335aa62aacf2b644f2ff2f0bdfd89136323698a39Anders Carlsson// (making A2 a virtual base of V1)
4435aa62aacf2b644f2ff2f0bdfd89136323698a39Anders Carlssonnamespace Test4 {
4535aa62aacf2b644f2ff2f0bdfd89136323698a39Anders Carlsson  class A1 { int i; };
4635aa62aacf2b644f2ff2f0bdfd89136323698a39Anders Carlsson  class A2 { int i; virtual void f(); };
4735aa62aacf2b644f2ff2f0bdfd89136323698a39Anders Carlsson  class V1 : public A1, public virtual A2 { int i; };
4835aa62aacf2b644f2ff2f0bdfd89136323698a39Anders Carlsson  class B1 { int i; };
4935aa62aacf2b644f2ff2f0bdfd89136323698a39Anders Carlsson  class B2 { int i; };
5035aa62aacf2b644f2ff2f0bdfd89136323698a39Anders Carlsson  class V2 : public B1, public B2, public virtual V1 { int i; };
5135aa62aacf2b644f2ff2f0bdfd89136323698a39Anders Carlsson  class V3 {virtual void g(); };
5235aa62aacf2b644f2ff2f0bdfd89136323698a39Anders Carlsson  class C1 : public virtual V1 { int i; };
5335aa62aacf2b644f2ff2f0bdfd89136323698a39Anders Carlsson  class C2 : public virtual V3, virtual V2 { int i; };
5435aa62aacf2b644f2ff2f0bdfd89136323698a39Anders Carlsson  class X1 { int i; };
5535aa62aacf2b644f2ff2f0bdfd89136323698a39Anders Carlsson  class C3 : public X1 { int i; };
5635aa62aacf2b644f2ff2f0bdfd89136323698a39Anders Carlsson  class D : public C1, public C2, public C3 { int i;  };
5735aa62aacf2b644f2ff2f0bdfd89136323698a39Anders Carlsson
5835aa62aacf2b644f2ff2f0bdfd89136323698a39Anders Carlsson  D d;
5935aa62aacf2b644f2ff2f0bdfd89136323698a39Anders Carlsson}
6035aa62aacf2b644f2ff2f0bdfd89136323698a39Anders Carlsson
6182a0f4e93c055fb12f5ad7c3d146d50eb201308fRafael Espindola// CHECK: @_ZTTN5Test11BE = unnamed_addr constant [1 x i8*] [i8* bitcast (i8** getelementptr inbounds ([4 x i8*]* @_ZTVN5Test11BE, i64 0, i64 3) to i8*)]
62f502d93b0ea970bfbd897e657f8d940a20984de2Anders Carlsson// CHECK: @_ZTTN5Test41DE = linkonce_odr unnamed_addr constant [19 x i8*] [i8* bitcast (i8** getelementptr inbounds ([25 x i8*]* @_ZTVN5Test41DE, i64 0, i64 6) to i8*), i8* bitcast (i8** getelementptr inbounds ([11 x i8*]* @_ZTCN5Test41DE0_NS_2C1E, i64 0, i64 4) to i8*), i8* bitcast (i8** getelementptr inbounds ([11 x i8*]* @_ZTCN5Test41DE0_NS_2C1E, i64 0, i64 7) to i8*), i8* bitcast (i8** getelementptr inbounds ([11 x i8*]* @_ZTCN5Test41DE0_NS_2C1E, i64 0, i64 10) to i8*), i8* bitcast (i8** getelementptr inbounds ([19 x i8*]* @_ZTCN5Test41DE16_NS_2C2E, i64 0, i64 7) to i8*), i8* bitcast (i8** getelementptr inbounds ([19 x i8*]* @_ZTCN5Test41DE16_NS_2C2E, i64 0, i64 7) to i8*), i8* bitcast (i8** getelementptr inbounds ([19 x i8*]* @_ZTCN5Test41DE16_NS_2C2E, i64 0, i64 12) to i8*), i8* bitcast (i8** getelementptr inbounds ([19 x i8*]* @_ZTCN5Test41DE16_NS_2C2E, i64 0, i64 15) to i8*), i8* bitcast (i8** getelementptr inbounds ([19 x i8*]* @_ZTCN5Test41DE16_NS_2C2E, i64 0, i64 18) to i8*), i8* bitcast (i8** getelementptr inbounds ([25 x i8*]* @_ZTVN5Test41DE, i64 0, i64 17) to i8*), i8* bitcast (i8** getelementptr inbounds ([25 x i8*]* @_ZTVN5Test41DE, i64 0, i64 20) to i8*), i8* bitcast (i8** getelementptr inbounds ([25 x i8*]* @_ZTVN5Test41DE, i64 0, i64 13) to i8*), i8* bitcast (i8** getelementptr inbounds ([25 x i8*]* @_ZTVN5Test41DE, i64 0, i64 13) to i8*), i8* bitcast (i8** getelementptr inbounds ([25 x i8*]* @_ZTVN5Test41DE, i64 1, i64 0) to i8*), i8* bitcast (i8** getelementptr inbounds ([7 x i8*]* @_ZTCN5Test41DE40_NS_2V1E, i64 0, i64 3) to i8*), i8* bitcast (i8** getelementptr inbounds ([7 x i8*]* @_ZTCN5Test41DE40_NS_2V1E, i64 0, i64 6) to i8*), i8* bitcast (i8** getelementptr inbounds ([11 x i8*]* @_ZTCN5Test41DE72_NS_2V2E, i64 0, i64 4) to i8*), i8* bitcast (i8** getelementptr inbounds ([11 x i8*]* @_ZTCN5Test41DE72_NS_2V2E, i64 0, i64 7) to i8*), i8* bitcast (i8** getelementptr inbounds ([11 x i8*]* @_ZTCN5Test41DE72_NS_2V2E, i64 0, i64 10) to i8*)]
63f502d93b0ea970bfbd897e657f8d940a20984de2Anders Carlsson// CHECK: @_ZTTN5Test31DE = linkonce_odr unnamed_addr constant [13 x i8*] [i8* bitcast (i8** getelementptr inbounds ([19 x i8*]* @_ZTVN5Test31DE, i64 0, i64 5) to i8*), i8* bitcast (i8** getelementptr inbounds ([7 x i8*]* @_ZTCN5Test31DE0_NS_2C1E, i64 0, i64 3) to i8*), i8* bitcast (i8** getelementptr inbounds ([7 x i8*]* @_ZTCN5Test31DE0_NS_2C1E, i64 0, i64 6) to i8*), i8* bitcast (i8** getelementptr inbounds ([14 x i8*]* @_ZTCN5Test31DE16_NS_2C2E, i64 0, i64 6) to i8*), i8* bitcast (i8** getelementptr inbounds ([14 x i8*]* @_ZTCN5Test31DE16_NS_2C2E, i64 0, i64 6) to i8*), i8* bitcast (i8** getelementptr inbounds ([14 x i8*]* @_ZTCN5Test31DE16_NS_2C2E, i64 0, i64 10) to i8*), i8* bitcast (i8** getelementptr inbounds ([14 x i8*]* @_ZTCN5Test31DE16_NS_2C2E, i64 0, i64 13) to i8*), i8* bitcast (i8** getelementptr inbounds ([19 x i8*]* @_ZTVN5Test31DE, i64 0, i64 15) to i8*), i8* bitcast (i8** getelementptr inbounds ([19 x i8*]* @_ZTVN5Test31DE, i64 0, i64 11) to i8*), i8* bitcast (i8** getelementptr inbounds ([19 x i8*]* @_ZTVN5Test31DE, i64 0, i64 11) to i8*), i8* bitcast (i8** getelementptr inbounds ([19 x i8*]* @_ZTVN5Test31DE, i64 1, i64 0) to i8*), i8* bitcast (i8** getelementptr inbounds ([7 x i8*]* @_ZTCN5Test31DE64_NS_2V2E, i64 0, i64 3) to i8*), i8* bitcast (i8** getelementptr inbounds ([7 x i8*]* @_ZTCN5Test31DE64_NS_2V2E, i64 0, i64 6) to i8*)]
64f502d93b0ea970bfbd897e657f8d940a20984de2Anders Carlsson// CHECK: @_ZTTN5Test21CE = linkonce_odr unnamed_addr constant [2 x i8*] [i8* bitcast (i8** getelementptr inbounds ([5 x i8*]* @_ZTVN5Test21CE, i64 0, i64 4) to i8*), i8* bitcast (i8** getelementptr inbounds ([5 x i8*]* @_ZTVN5Test21CE, i64 0, i64 4) to i8*)]
65