namespace no_thunks {
struct Test1: A, B {
- // NO-THUNKS-Test1: VFTable for 'A' in 'no_thunks::Test1' (1 entries)
+ // NO-THUNKS-Test1: VFTable for 'A' in 'no_thunks::Test1' (1 entry)
// NO-THUNKS-Test1-NEXT: 0 | void no_thunks::Test1::f()
// NO-THUNKS-Test1: VFTable for 'B' in 'no_thunks::Test1' (2 entries)
// NO-THUNKS-Test1-NEXT: 0 | void B::g()
// NO-THUNKS-Test1-NEXT: 1 | void B::h()
- // NO-THUNKS-Test1: VFTable indices for 'no_thunks::Test1' (1 entries)
+ // NO-THUNKS-Test1: VFTable indices for 'no_thunks::Test1' (1 entry)
// NO-THUNKS-Test1-NEXT: 0 | void no_thunks::Test1::f()
// MANGLING-DAG: @"\01??_7Test1@no_thunks@@6BA@@@"
Test1 t1;
struct Test2: A, B {
- // NO-THUNKS-Test2: VFTable for 'A' in 'no_thunks::Test2' (1 entries)
+ // NO-THUNKS-Test2: VFTable for 'A' in 'no_thunks::Test2' (1 entry)
// NO-THUNKS-Test2-NEXT: 0 | void A::f()
// NO-THUNKS-Test2: VFTable for 'B' in 'no_thunks::Test2' (2 entries)
// NO-THUNKS-Test2-NEXT: 0 | void no_thunks::Test2::g()
// NO-THUNKS-Test2-NEXT: 1 | void B::h()
- // NO-THUNKS-Test2: VFTable indices for 'no_thunks::Test2' (1 entries).
+ // NO-THUNKS-Test2: VFTable indices for 'no_thunks::Test2' (1 entry).
// NO-THUNKS-Test2-NEXT: via vfptr at offset 4
// NO-THUNKS-Test2-NEXT: 0 | void no_thunks::Test2::g()
// NO-THUNKS-Test3-NEXT: 0 | void B::g()
// NO-THUNKS-Test3-NEXT: 1 | void B::h()
- // NO-THUNKS-Test3: VFTable indices for 'no_thunks::Test3' (1 entries).
+ // NO-THUNKS-Test3: VFTable indices for 'no_thunks::Test3' (1 entry).
// NO-THUNKS-Test3-NEXT: 1 | void no_thunks::Test3::i()
// Only adds a new method.
// Only the right base has a vftable, so it's laid out before the left one!
struct Test4 : Empty, A {
- // NO-THUNKS-Test4: VFTable for 'A' in 'no_thunks::Test4' (1 entries)
+ // NO-THUNKS-Test4: VFTable for 'A' in 'no_thunks::Test4' (1 entry)
// NO-THUNKS-Test4-NEXT: 0 | void no_thunks::Test4::f()
- // NO-THUNKS-Test4: VFTable indices for 'no_thunks::Test4' (1 entries).
+ // NO-THUNKS-Test4: VFTable indices for 'no_thunks::Test4' (1 entry).
// NO-THUNKS-Test4-NEXT: 0 | void no_thunks::Test4::f()
// MANGLING-DAG: @"\01??_7Test4@no_thunks@@6B@"
// NO-THUNKS-Test5-NEXT: 0 | void B::g()
// NO-THUNKS-Test5-NEXT: 1 | void B::h()
- // NO-THUNKS-Test5: VFTable for 'A' in 'no_thunks::Test2' in 'no_thunks::Test5' (1 entries)
+ // NO-THUNKS-Test5: VFTable for 'A' in 'no_thunks::Test2' in 'no_thunks::Test5' (1 entry)
// NO-THUNKS-Test5-NEXT: 0 | void A::f()
// NO-THUNKS-Test5: VFTable for 'B' in 'no_thunks::Test2' in 'no_thunks::Test5' (2 entries)
// NO-THUNKS-Test5-NEXT: 0 | void no_thunks::Test2::g()
// NO-THUNKS-Test5-NEXT: 1 | void B::h()
- // NO-THUNKS-Test5: VFTable indices for 'no_thunks::Test5' (1 entries).
+ // NO-THUNKS-Test5: VFTable indices for 'no_thunks::Test5' (1 entry).
// NO-THUNKS-Test5-NEXT: 1 | void no_thunks::Test5::z()
// MANGLING-DAG: @"\01??_7Test5@no_thunks@@6BA@@Test1@1@@"
Test5 t5;
struct Test6: Test1 {
- // NO-THUNKS-Test6: VFTable for 'A' in 'no_thunks::Test1' in 'no_thunks::Test6' (1 entries).
+ // NO-THUNKS-Test6: VFTable for 'A' in 'no_thunks::Test1' in 'no_thunks::Test6' (1 entry).
// NO-THUNKS-Test6-NEXT: 0 | void no_thunks::Test6::f()
// NO-THUNKS-Test6: VFTable for 'B' in 'no_thunks::Test1' in 'no_thunks::Test6' (2 entries).
// NO-THUNKS-Test6-NEXT: 0 | void B::g()
// NO-THUNKS-Test6-NEXT: 1 | void B::h()
- // NO-THUNKS-Test6: VFTable indices for 'no_thunks::Test6' (1 entries).
+ // NO-THUNKS-Test6: VFTable indices for 'no_thunks::Test6' (1 entry).
// NO-THUNKS-Test6-NEXT: 0 | void no_thunks::Test6::f()
// MANGLING-DAG: @"\01??_7Test6@no_thunks@@6BA@@@"
Test6 t6;
struct Test7: Test2 {
- // NO-THUNKS-Test7: VFTable for 'A' in 'no_thunks::Test2' in 'no_thunks::Test7' (1 entries).
+ // NO-THUNKS-Test7: VFTable for 'A' in 'no_thunks::Test2' in 'no_thunks::Test7' (1 entry).
// NO-THUNKS-Test7-NEXT: 0 | void A::f()
// NO-THUNKS-Test7: VFTable for 'B' in 'no_thunks::Test2' in 'no_thunks::Test7' (2 entries).
// NO-THUNKS-Test7-NEXT: 0 | void no_thunks::Test7::g()
// NO-THUNKS-Test7-NEXT: 1 | void B::h()
- // NO-THUNKS-Test7: VFTable indices for 'no_thunks::Test7' (1 entries).
+ // NO-THUNKS-Test7: VFTable indices for 'no_thunks::Test7' (1 entry).
// NO-THUNKS-Test7-NEXT: via vfptr at offset 4
// NO-THUNKS-Test7-NEXT: 0 | void no_thunks::Test7::g()
// NO-THUNKS-Test8-NEXT: 0 | void no_thunks::Test8::g()
// NO-THUNKS-Test8-NEXT: 1 | void B::h()
- // NO-THUNKS-Test8: VFTable indices for 'no_thunks::Test8' (1 entries).
+ // NO-THUNKS-Test8: VFTable indices for 'no_thunks::Test8' (1 entry).
// NO-THUNKS-Test8-NEXT: via vfptr at offset 4
// NO-THUNKS-Test8-NEXT: 0 | void no_thunks::Test8::g()
// NO-THUNKS-Test9-NEXT: 0 | void A::f()
// NO-THUNKS-Test9-NEXT: 1 | void no_thunks::D::g()
- // NO-THUNKS-Test9: VFTable indices for 'no_thunks::Test9' (1 entries).
+ // NO-THUNKS-Test9: VFTable indices for 'no_thunks::Test9' (1 entry).
// NO-THUNKS-Test9-NEXT: 1 | void no_thunks::Test9::h()
// MANGLING-DAG: @"\01??_7Test9@no_thunks@@6BA@@@"
struct Test1: A, D {
- // PURE-VIRTUAL-Test1: VFTable for 'A' in 'pure_virtual::Test1' (1 entries)
+ // PURE-VIRTUAL-Test1: VFTable for 'A' in 'pure_virtual::Test1' (1 entry)
// PURE-VIRTUAL-Test1-NEXT: 0 | void A::f()
// PURE-VIRTUAL-Test1: VFTable for 'pure_virtual::D' in 'pure_virtual::Test1' (2 entries)
// PURE-VIRTUAL-Test1-NEXT: 0 | void pure_virtual::Test1::g()
// PURE-VIRTUAL-Test1-NEXT: 1 | void pure_virtual::D::h()
- // PURE-VIRTUAL-Test1: VFTable indices for 'pure_virtual::Test1' (1 entries).
+ // PURE-VIRTUAL-Test1: VFTable indices for 'pure_virtual::Test1' (1 entry).
// PURE-VIRTUAL-Test1-NEXT: via vfptr at offset 4
// PURE-VIRTUAL-Test1-NEXT: 0 | void pure_virtual::Test1::g()
// THIS-THUNKS-Test1-NEXT: 0 | void this_adjustment::Test1::g()
// THIS-THUNKS-Test1-NEXT: 1 | void B::h()
- // THIS-THUNKS-Test1: VFTable for 'C' in 'this_adjustment::Test1' (1 entries).
+ // THIS-THUNKS-Test1: VFTable for 'C' in 'this_adjustment::Test1' (1 entry).
// THIS-THUNKS-Test1-NEXT: 0 | void this_adjustment::Test1::g()
// THIS-THUNKS-Test1-NEXT: [this adjustment: -4 non-virtual]
// THIS-THUNKS-Test1: Thunks for 'void this_adjustment::Test1::g()' (1 entry).
// THIS-THUNKS-Test1-NEXT: 0 | [this adjustment: -4 non-virtual]
- // THIS-THUNKS-Test1: VFTable indices for 'this_adjustment::Test1' (1 entries).
+ // THIS-THUNKS-Test1: VFTable indices for 'this_adjustment::Test1' (1 entry).
// THIS-THUNKS-Test1-NEXT: 0 | void this_adjustment::Test1::g()
// MANGLING-DAG: @"\01??_7Test1@this_adjustment@@6BB@@@"
Test1 t1;
struct Test2 : A, B, C {
- // THIS-THUNKS-Test2: VFTable for 'A' in 'this_adjustment::Test2' (1 entries).
+ // THIS-THUNKS-Test2: VFTable for 'A' in 'this_adjustment::Test2' (1 entry).
// THIS-THUNKS-Test2-NEXT: 0 | void A::f()
// THIS-THUNKS-Test2: VFTable for 'B' in 'this_adjustment::Test2' (2 entries).
// THIS-THUNKS-Test2-NEXT: 0 | void this_adjustment::Test2::g()
// THIS-THUNKS-Test2-NEXT: 1 | void B::h()
- // THIS-THUNKS-Test2: VFTable for 'C' in 'this_adjustment::Test2' (1 entries).
+ // THIS-THUNKS-Test2: VFTable for 'C' in 'this_adjustment::Test2' (1 entry).
// THIS-THUNKS-Test2-NEXT: 0 | void this_adjustment::Test2::g()
// THIS-THUNKS-Test2-NEXT: [this adjustment: -4 non-virtual]
// THIS-THUNKS-Test2: Thunks for 'void this_adjustment::Test2::g()' (1 entry).
// THIS-THUNKS-Test2-NEXT: 0 | [this adjustment: -4 non-virtual]
- // THIS-THUNKS-Test2: VFTable indices for 'this_adjustment::Test2' (1 entries).
+ // THIS-THUNKS-Test2: VFTable indices for 'this_adjustment::Test2' (1 entry).
// THIS-THUNKS-Test2-NEXT: via vfptr at offset 4
// THIS-THUNKS-Test2-NEXT: 0 | void this_adjustment::Test2::g()
// Overrides methods of two bases at the same time, thus needing thunks.
struct Test3: no_thunks::Test1, no_thunks::Test2 {
- // THIS-THUNKS-Test3: VFTable for 'A' in 'no_thunks::Test1' in 'this_adjustment::Test3' (1 entries).
+ // THIS-THUNKS-Test3: VFTable for 'A' in 'no_thunks::Test1' in 'this_adjustment::Test3' (1 entry).
// THIS-THUNKS-Test3-NEXT: 0 | void this_adjustment::Test3::f()
// THIS-THUNKS-Test3: VFTable for 'B' in 'no_thunks::Test1' in 'this_adjustment::Test3' (2 entries).
// THIS-THUNKS-Test3-NEXT: 0 | void this_adjustment::Test3::g()
// THIS-THUNKS-Test3-NEXT: 1 | void B::h()
- // THIS-THUNKS-Test3: VFTable for 'A' in 'no_thunks::Test2' in 'this_adjustment::Test3' (1 entries).
+ // THIS-THUNKS-Test3: VFTable for 'A' in 'no_thunks::Test2' in 'this_adjustment::Test3' (1 entry).
// THIS-THUNKS-Test3-NEXT: 0 | void this_adjustment::Test3::f()
// THIS-THUNKS-Test3-NEXT: [this adjustment: -8 non-virtual]
// VDTOR-THUNKS-Test3-NEXT: 0 | vdtor::Test3::~Test3() [scalar deleting]
// VDTOR-THUNKS-Test3-NEXT: 1 | void vdtor::Test1::z1()
- // VDTOR-THUNKS-Test3: VFTable for 'vdtor::Test2' in 'vdtor::Test3' (1 entries).
+ // VDTOR-THUNKS-Test3: VFTable for 'vdtor::Test2' in 'vdtor::Test3' (1 entry).
// VDTOR-THUNKS-Test3-NEXT: 0 | vdtor::Test3::~Test3() [scalar deleting]
// VDTOR-THUNKS-Test3-NEXT: [this adjustment: -4 non-virtual]
// VDTOR-THUNKS-Test3: Thunks for 'vdtor::Test3::~Test3()' (1 entry).
// VDTOR-THUNKS-Test3-NEXT: 0 | [this adjustment: -4 non-virtual]
- // VDTOR-THUNKS-Test3: VFTable indices for 'vdtor::Test3' (1 entries).
+ // VDTOR-THUNKS-Test3: VFTable indices for 'vdtor::Test3' (1 entry).
// VDTOR-THUNKS-Test3-NEXT: 0 | vdtor::Test3::~Test3() [scalar deleting]
virtual ~Test3();
};
struct Test5 : Test4, Test2 {
// Implicit virtual dtor here!
- // VDTOR-THUNKS-Test5: VFTable for 'vdtor::Test4' in 'vdtor::Test5' (1 entries).
+ // VDTOR-THUNKS-Test5: VFTable for 'vdtor::Test4' in 'vdtor::Test5' (1 entry).
// VDTOR-THUNKS-Test5-NEXT: 0 | void vdtor::Test4::z4()
- // VDTOR-THUNKS-Test5: VFTable for 'vdtor::Test2' in 'vdtor::Test5' (1 entries).
+ // VDTOR-THUNKS-Test5: VFTable for 'vdtor::Test2' in 'vdtor::Test5' (1 entry).
// VDTOR-THUNKS-Test5-NEXT: 0 | vdtor::Test5::~Test5() [scalar deleting]
// VDTOR-THUNKS-Test5-NEXT: [this adjustment: -4 non-virtual]
// VDTOR-THUNKS-Test5: Thunks for 'vdtor::Test5::~Test5()' (1 entry).
// VDTOR-THUNKS-Test5-NEXT: 0 | [this adjustment: -4 non-virtual]
- // VDTOR-THUNKS-Test5: VFTable indices for 'vdtor::Test5' (1 entries).
+ // VDTOR-THUNKS-Test5: VFTable indices for 'vdtor::Test5' (1 entry).
// VDTOR-THUNKS-Test5-NEXT: -- accessible via vfptr at offset 4 --
// VDTOR-THUNKS-Test5-NEXT: 0 | vdtor::Test5::~Test5() [scalar deleting]
};
struct Test6 : Test4, Test2 {
// Implicit virtual dtor here!
- // VDTOR-THUNKS-Test6: VFTable for 'vdtor::Test4' in 'vdtor::Test6' (1 entries).
+ // VDTOR-THUNKS-Test6: VFTable for 'vdtor::Test4' in 'vdtor::Test6' (1 entry).
// VDTOR-THUNKS-Test6-NEXT: 0 | void vdtor::Test4::z4()
- // VDTOR-THUNKS-Test6: VFTable for 'vdtor::Test2' in 'vdtor::Test6' (1 entries).
+ // VDTOR-THUNKS-Test6: VFTable for 'vdtor::Test2' in 'vdtor::Test6' (1 entry).
// VDTOR-THUNKS-Test6-NEXT: 0 | vdtor::Test6::~Test6() [scalar deleting]
// VDTOR-THUNKS-Test6-NEXT: [this adjustment: -4 non-virtual]
// VDTOR-THUNKS-Test6: Thunks for 'vdtor::Test6::~Test6()' (1 entry).
// VDTOR-THUNKS-Test6-NEXT: 0 | [this adjustment: -4 non-virtual]
- // VDTOR-THUNKS-Test6: VFTable indices for 'vdtor::Test6' (1 entries).
+ // VDTOR-THUNKS-Test6: VFTable indices for 'vdtor::Test6' (1 entry).
// VDTOR-THUNKS-Test6-NEXT: -- accessible via vfptr at offset 4 --
// VDTOR-THUNKS-Test6-NEXT: 0 | vdtor::Test6::~Test6() [scalar deleting]
};
Test6 t6;
struct Test7 : Test5 {
- // VDTOR-THUNKS-Test7: VFTable for 'vdtor::Test4' in 'vdtor::Test5' in 'vdtor::Test7' (1 entries).
+ // VDTOR-THUNKS-Test7: VFTable for 'vdtor::Test4' in 'vdtor::Test5' in 'vdtor::Test7' (1 entry).
// VDTOR-THUNKS-Test7-NEXT: 0 | void vdtor::Test4::z4()
- // VDTOR-THUNKS-Test7: VFTable for 'vdtor::Test2' in 'vdtor::Test5' in 'vdtor::Test7' (1 entries).
+ // VDTOR-THUNKS-Test7: VFTable for 'vdtor::Test2' in 'vdtor::Test5' in 'vdtor::Test7' (1 entry).
// VDTOR-THUNKS-Test7-NEXT: 0 | vdtor::Test7::~Test7() [scalar deleting]
// VDTOR-THUNKS-Test7-NEXT: [this adjustment: -4 non-virtual]
// VDTOR-THUNKS-Test7: Thunks for 'vdtor::Test7::~Test7()' (1 entry).
// VDTOR-THUNKS-Test7-NEXT: 0 | [this adjustment: -4 non-virtual]
- // VDTOR-THUNKS-Test7: VFTable indices for 'vdtor::Test7' (1 entries).
+ // VDTOR-THUNKS-Test7: VFTable indices for 'vdtor::Test7' (1 entry).
// VDTOR-THUNKS-Test7-NEXT: -- accessible via vfptr at offset 4 --
// VDTOR-THUNKS-Test7-NEXT: 0 | vdtor::Test7::~Test7() [scalar deleting]
virtual ~Test7();
// RET-THUNKS-Test1-NEXT: 1 | void return_adjustment::Ret1::z()
// RET-THUNKS-Test1-NEXT: 2 | this_adjustment::Test1 *return_adjustment::Test1::foo()
- // RET-THUNKS-Test1: VFTable indices for 'return_adjustment::Test1' (1 entries).
+ // RET-THUNKS-Test1: VFTable indices for 'return_adjustment::Test1' (1 entry).
// RET-THUNKS-Test1-NEXT: 2 | this_adjustment::Test1 *return_adjustment::Test1::foo()
// MANGLING-DAG: @"\01??_7Test1@return_adjustment@@6B@"
// RET-THUNKS-Test2-NEXT: [return adjustment: 4 non-virtual]
// RET-THUNKS-Test2-NEXT: 3 | return_adjustment::Ret2 *return_adjustment::Test2::foo()
- // RET-THUNKS-Test2: VFTable indices for 'return_adjustment::Test2' (1 entries).
+ // RET-THUNKS-Test2: VFTable indices for 'return_adjustment::Test2' (1 entry).
// RET-THUNKS-Test2-NEXT: 3 | return_adjustment::Ret2 *return_adjustment::Test2::foo()
virtual Ret2* foo();
// RET-THUNKS-Test3-NEXT: 1 | void return_adjustment::Ret1::z()
// RET-THUNKS-Test3-NEXT: 2 | this_adjustment::Test1 *return_adjustment::Test3::foo()
- // RET-THUNKS-Test3: VFTable indices for 'return_adjustment::Test3' (1 entries).
+ // RET-THUNKS-Test3: VFTable indices for 'return_adjustment::Test3' (1 entry).
// RET-THUNKS-Test3-NEXT: via vfptr at offset 4
// RET-THUNKS-Test3-NEXT: 2 | this_adjustment::Test1 *return_adjustment::Test3::foo()
// RET-THUNKS-Test4-NEXT: [return adjustment: 4 non-virtual]
// RET-THUNKS-Test4-NEXT: 3 | return_adjustment::Ret2 *return_adjustment::Test4::foo()
- // RET-THUNKS-Test4: VFTable indices for 'return_adjustment::Test4' (1 entries).
+ // RET-THUNKS-Test4: VFTable indices for 'return_adjustment::Test4' (1 entry).
// RET-THUNKS-Test4-NEXT: -- accessible via vfptr at offset 4 --
// RET-THUNKS-Test4-NEXT: 3 | return_adjustment::Ret2 *return_adjustment::Test4::foo()
// RET-THUNKS-Test5-NEXT: 3 | return_adjustment::Ret2 *return_adjustment::Test5::foo()
// RET-THUNKS-Test5-NEXT: [this adjustment: -4 non-virtual]
- // RET-THUNKS-Test5: VFTable indices for 'return_adjustment::Test5' (1 entries).
+ // RET-THUNKS-Test5: VFTable indices for 'return_adjustment::Test5' (1 entry).
// RET-THUNKS-Test5-NEXT: 2 | return_adjustment::Ret2 *return_adjustment::Test5::foo()
virtual Ret2* foo();
// RET-THUNKS-Test6-NEXT: 2 | return_adjustment::Ret3 *return_adjustment::Test6::foo()
// RET-THUNKS-Test6-NEXT: 3 | return_adjustment::Ret3 *return_adjustment::Test6::foo()
- // RET-THUNKS-Test6: VFTable indices for 'return_adjustment::Test6' (1 entries).
+ // RET-THUNKS-Test6: VFTable indices for 'return_adjustment::Test6' (1 entry).
// RET-THUNKS-Test6-NEXT: 3 | return_adjustment::Ret3 *return_adjustment::Test6::foo()
};
// VTABLE-C-NEXT: 0 | void C::f()
// VTABLE-C-NEXT: 1 | void A::z()
- // VTABLE-C: VFTable indices for 'C' (1 entries)
+ // VTABLE-C: VFTable indices for 'C' (1 entry)
// VTABLE-C-NEXT: vbtable index 1, vfptr at offset 0
// VTABLE-C-NEXT: 0 | void C::f()
C c;
struct D: virtual A {
- // VTABLE-D: VFTable for 'D' (1 entries).
+ // VTABLE-D: VFTable for 'D' (1 entry).
// VTABLE-D-NEXT: 0 | void D::h()
// VTABLE-D: VFTable for 'A' in 'D' (2 entries).
namespace Test2 {
struct X: virtual A, virtual B {
- // TEST2: VFTable for 'Test2::X' (1 entries).
+ // TEST2: VFTable for 'Test2::X' (1 entry).
// TEST2-NEXT: 0 | void Test2::X::h()
// TEST2: VFTable for 'A' in 'Test2::X' (2 entries).
// TEST2-NEXT: 0 | void A::f()
// TEST2-NEXT: 1 | void A::z()
- // TEST2: VFTable for 'B' in 'Test2::X' (1 entries).
+ // TEST2: VFTable for 'B' in 'Test2::X' (1 entry).
// TEST2-NEXT: 0 | void B::g()
- // TEST2: VFTable indices for 'Test2::X' (1 entries).
+ // TEST2: VFTable indices for 'Test2::X' (1 entry).
// TEST2-NEXT: 0 | void Test2::X::h()
// MANGLING-DAG: @"\01??_7X@Test2@@6B01@@"
};
struct Y : virtual X {
- // TEST5: VFTable for 'Test5::Y' (1 entries).
+ // TEST5: VFTable for 'Test5::Y' (1 entry).
// TEST5-NEXT: 0 | void Test5::Y::h()
// TEST5: VFTable for 'A' in 'Test5::X' in 'Test5::Y' (3 entries).
// TEST5-NEXT: 1 | void A::z()
// TEST5-NEXT: 2 | void Test5::X::g()
- // TEST5: VFTable indices for 'Test5::Y' (1 entries).
+ // TEST5: VFTable indices for 'Test5::Y' (1 entry).
// TEST5-NEXT: 0 | void Test5::Y::h()
// MANGLING-DAG: @"\01??_7Y@Test5@@6B01@@"
// This is a typical diamond inheritance with a shared 'A' vbase.
struct X : D, C {
- // TEST8-X: VFTable for 'D' in 'Test8::X' (1 entries).
+ // TEST8-X: VFTable for 'D' in 'Test8::X' (1 entry).
// TEST8-X-NEXT: 0 | void D::h()
// TEST8-X: VFTable for 'A' in 'D' in 'Test8::X' (2 entries).
// TEST8-X-NEXT: 0 | void Test8::X::f()
// TEST8-X-NEXT: 1 | void A::z()
- // TEST8-X: VFTable indices for 'Test8::X' (1 entries).
+ // TEST8-X: VFTable indices for 'Test8::X' (1 entry).
// TEST8-X-NEXT: via vbtable index 1, vfptr at offset 0
// TEST8-X-NEXT: 0 | void Test8::X::f()
// TEST8-Z-NEXT: 0 | void Test8::Z::f()
// TEST8-Z-NEXT: 1 | void A::z()
- // TEST8-Z: VFTable indices for 'Test8::Z' (1 entries).
+ // TEST8-Z: VFTable indices for 'Test8::Z' (1 entry).
// TEST8-Z-NEXT: via vbtable index 1, vfptr at offset 0
// TEST8-Z-NEXT: 0 | void Test8::Z::f()
virtual void f();
struct X : A { };
struct Y : virtual X {
- // TEST9-Y: VFTable for 'Test9::Y' (1 entries).
+ // TEST9-Y: VFTable for 'Test9::Y' (1 entry).
// TEST9-Y-NEXT: 0 | void Test9::Y::h()
// TEST9-Y: VFTable for 'A' in 'Test9::X' in 'Test9::Y' (2 entries).
// TEST9-Y-NEXT: 0 | void A::f()
// TEST9-Y-NEXT: 1 | void A::z()
- // TEST9-Y: VFTable indices for 'Test9::Y' (1 entries).
+ // TEST9-Y: VFTable indices for 'Test9::Y' (1 entry).
// TEST9-Y-NEXT: 0 | void Test9::Y::h()
// MANGLING-DAG: @"\01??_7Y@Test9@@6B01@@"
Y y;
struct Z : Y, virtual B {
- // TEST9-Z: VFTable for 'Test9::Y' in 'Test9::Z' (1 entries).
+ // TEST9-Z: VFTable for 'Test9::Y' in 'Test9::Z' (1 entry).
// TEST9-Z-NEXT: 0 | void Test9::Y::h()
// TEST9-Z: VFTable for 'A' in 'Test9::X' in 'Test9::Y' in 'Test9::Z' (2 entries).
// TEST9-Z-NEXT: 0 | void A::f()
// TEST9-Z-NEXT: 1 | void A::z()
- // TEST9-Z: VFTable for 'B' in 'Test9::Z' (1 entries).
+ // TEST9-Z: VFTable for 'B' in 'Test9::Z' (1 entry).
// TEST9-Z-NEXT: 0 | void B::g()
// TEST9-Z-NOT: VFTable indices for 'Test9::Z'
Z z;
struct W : Z, D, virtual A, virtual B {
- // TEST9-W: VFTable for 'Test9::Y' in 'Test9::Z' in 'Test9::W' (1 entries).
+ // TEST9-W: VFTable for 'Test9::Y' in 'Test9::Z' in 'Test9::W' (1 entry).
// TEST9-W-NEXT: 0 | void Test9::Y::h()
// TEST9-W: VFTable for 'A' in 'Test9::X' in 'Test9::Y' in 'Test9::Z' in 'Test9::W' (2 entries).
// TEST9-W-NEXT: 0 | void A::f()
// TEST9-W-NEXT: 1 | void A::z()
- // TEST9-W: VFTable for 'B' in 'Test9::Z' in 'Test9::W' (1 entries).
+ // TEST9-W: VFTable for 'B' in 'Test9::Z' in 'Test9::W' (1 entry).
// TEST9-W-NEXT: 0 | void B::g()
- // TEST9-W: VFTable for 'D' in 'Test9::W' (1 entries).
+ // TEST9-W: VFTable for 'D' in 'Test9::W' (1 entry).
// TEST9-W-NEXT: 0 | void D::h()
// TEST9-W: VFTable for 'A' in 'D' in 'Test9::W' (2 entries).
W w;
struct T : Z, D, virtual A, virtual B {
- // TEST9-T: VFTable for 'Test9::Y' in 'Test9::Z' in 'Test9::T' (1 entries).
+ // TEST9-T: VFTable for 'Test9::Y' in 'Test9::Z' in 'Test9::T' (1 entry).
// TEST9-T-NEXT: 0 | void Test9::T::h()
// TEST9-T: VFTable for 'A' in 'Test9::X' in 'Test9::Y' in 'Test9::Z' in 'Test9::T' (2 entries).
// TEST9-T-NEXT: 0 | void Test9::T::f()
// TEST9-T-NEXT: 1 | void Test9::T::z()
- // TEST9-T: VFTable for 'B' in 'Test9::Z' in 'Test9::T' (1 entries).
+ // TEST9-T: VFTable for 'B' in 'Test9::Z' in 'Test9::T' (1 entry).
// TEST9-T-NEXT: 0 | void Test9::T::g()
- // TEST9-T: VFTable for 'D' in 'Test9::T' (1 entries).
+ // TEST9-T: VFTable for 'D' in 'Test9::T' (1 entry).
// TEST9-T-NEXT: 0 | void Test9::T::h()
// TEST9-T-NEXT: [this adjustment: -8 non-virtual]
// TEST10-NEXT: 0 | void Test10::X::f()
// TEST10-NEXT: 1 | void A::z()
- // TEST10: VFTable indices for 'Test10::X' (1 entries).
+ // TEST10: VFTable indices for 'Test10::X' (1 entry).
// TEST10-NEXT: via vbtable index 1, vfptr at offset 0
// TEST10-NEXT: 0 | void Test10::X::f()
virtual void f();
};
struct U : virtual W {
- // VDTORS-U: VFTable for 'vdtors::Z' in 'vdtors::W' in 'vdtors::U' (1 entries).
+ // VDTORS-U: VFTable for 'vdtors::Z' in 'vdtors::W' in 'vdtors::U' (1 entry).
// VDTORS-U-NEXT: 0 | void vdtors::Z::z()
// VDTORS-U: VFTable for 'vdtors::X' in 'vdtors::W' in 'vdtors::U' (2 entries).
// VDTORS-U: Thunks for 'vdtors::W::~W()' (1 entry).
// VDTORS-U-NEXT: 0 | [this adjustment: -4 non-virtual]
- // VDTORS-U: VFTable indices for 'vdtors::U' (1 entries).
+ // VDTORS-U: VFTable indices for 'vdtors::U' (1 entry).
// VDTORS-U-NEXT: -- accessible via vbtable index 1, vfptr at offset 4 --
// VDTORS-U-NEXT: 0 | vdtors::U::~U() [scalar deleting]
virtual ~U();
U u;
struct V : virtual W {
- // VDTORS-V: VFTable for 'vdtors::Z' in 'vdtors::W' in 'vdtors::V' (1 entries).
+ // VDTORS-V: VFTable for 'vdtors::Z' in 'vdtors::W' in 'vdtors::V' (1 entry).
// VDTORS-V-NEXT: 0 | void vdtors::Z::z()
// VDTORS-V: VFTable for 'vdtors::X' in 'vdtors::W' in 'vdtors::V' (2 entries).
// VDTORS-V: Thunks for 'vdtors::W::~W()' (1 entry).
// VDTORS-V-NEXT: 0 | [this adjustment: -4 non-virtual]
- // VDTORS-V: VFTable indices for 'vdtors::V' (1 entries).
+ // VDTORS-V: VFTable indices for 'vdtors::V' (1 entry).
// VDTORS-V-NEXT: -- accessible via vbtable index 1, vfptr at offset 4 --
// VDTORS-V-NEXT: 0 | vdtors::V::~V() [scalar deleting]
};
// RET-W-NEXT: [return adjustment: vbase #1, 0 non-virtual]
// RET-W-NEXT: 1 | return_adjustment::X *return_adjustment::W::foo()
- // RET-W: VFTable indices for 'return_adjustment::W' (1 entries).
+ // RET-W: VFTable indices for 'return_adjustment::W' (1 entry).
// RET-W-NEXT: 1 | return_adjustment::X *return_adjustment::W::foo()
virtual X* foo();
// RET-T-NEXT: [return adjustment: vbase #2, 0 non-virtual]
// RET-T-NEXT: 2 | return_adjustment::Y *return_adjustment::T::foo()
- // RET-T: VFTable indices for 'return_adjustment::T' (1 entries).
+ // RET-T: VFTable indices for 'return_adjustment::T' (1 entry).
// RET-T-NEXT: 2 | return_adjustment::Y *return_adjustment::T::foo()
virtual Y* foo();
// RET-V-NEXT: [return adjustment: vbptr at offset 4, vbase #1, 0 non-virtual]
// RET-V-NEXT: 1 | return_adjustment::U *return_adjustment::V::foo()
- // RET-V: VFTable indices for 'return_adjustment::V' (1 entries).
+ // RET-V: VFTable indices for 'return_adjustment::V' (1 entry).
// RET-V-NEXT: 1 | return_adjustment::U *return_adjustment::V::foo()
virtual U* foo();