diff options
author | Anders Carlsson <andersca@mac.com> | 2010-02-12 05:25:12 +0000 |
---|---|---|
committer | Anders Carlsson <andersca@mac.com> | 2010-02-12 05:25:12 +0000 |
commit | 57071e29bdb65d21f72e221f2a16f24f6bea72f3 (patch) | |
tree | 717c56a85eb34fae30e3f9d25fca966823aabd5d /test/CodeGenCXX/vtable-layout.cpp | |
parent | 27935ee59c30b0d8b610ab676aab8e65350af932 (diff) |
More work on vtable layout. We can now layout vtables with primary bases.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@95965 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/CodeGenCXX/vtable-layout.cpp')
-rw-r--r-- | test/CodeGenCXX/vtable-layout.cpp | 61 |
1 files changed, 58 insertions, 3 deletions
diff --git a/test/CodeGenCXX/vtable-layout.cpp b/test/CodeGenCXX/vtable-layout.cpp index 3f7e18a095..f7db2135d2 100644 --- a/test/CodeGenCXX/vtable-layout.cpp +++ b/test/CodeGenCXX/vtable-layout.cpp @@ -9,8 +9,8 @@ namespace Test1 { struct A { virtual void f(); }; - void A::f() { } + } namespace Test2 { @@ -36,10 +36,10 @@ struct A { virtual void h(); virtual A& operator=(const A&); }; - void A::f() { } // Another simple vtable dumper test. + // CHECK: Vtable for 'Test2::B' (6 entries). // CHECK-NEXT: 0 | offset_to_top (0) // CHECK-NEXT: 1 | Test2::B RTTI @@ -48,13 +48,68 @@ void A::f() { } // CHECK-NEXT: 3 | void Test2::B::g() [pure] // CHECK-NEXT: 4 | Test2::B::~B() [complete] [pure] // CHECK-NEXT: 5 | Test2::B::~B() [deleting] [pure] - struct B { virtual void f(); virtual void g() = 0; virtual ~B() = 0; }; +void B::f() { } + +} + +namespace Test3 { +// If a function in a derived class overrides a function in a primary base, +// then the function should not have an entry in the derived class (unless the return +// value requires adjusting). + +// CHECK: Vtable for 'Test3::A' (3 entries). +// CHECK-NEXT: 0 | offset_to_top (0) +// CHECK-NEXT: 1 | Test3::A RTTI +// CHECK-NEXT: -- (Test3::A, 0) vtable address -- +// CHECK-NEXT: 2 | void Test3::A::f() +struct A { + virtual void f(); +}; +void A::f() { } + +// CHECK: Vtable for 'Test3::B' (4 entries). +// CHECK-NEXT: 0 | offset_to_top (0) +// CHECK-NEXT: 1 | Test3::B RTTI +// CHECK-NEXT: -- (Test3::B, 0) vtable address -- +// CHECK-NEXT: 2 | void Test3::A::f() +// CHECK-NEXT: 3 | void Test3::B::g() +struct B : A { + virtual void f(); + virtual void g(); +}; void B::f() { } +// CHECK: Vtable for 'Test3::C' (5 entries). +// CHECK-NEXT: 0 | offset_to_top (0) +// CHECK-NEXT: 1 | Test3::C RTTI +// CHECK-NEXT: -- (Test3::C, 0) vtable address -- +// CHECK-NEXT: 2 | void Test3::A::f() +// CHECK-NEXT: 3 | void Test3::C::g() +// CHECK-NEXT: 4 | void Test3::C::h() +struct C : A { + virtual void g(); + virtual void h(); +}; +void C::g() { } + +// CHECK: Vtable for 'Test3::D' (5 entries). +// CHECK-NEXT: 0 | offset_to_top (0) +// CHECK-NEXT: 1 | Test3::D RTTI +// CHECK-NEXT: -- (Test3::D, 0) vtable address -- +// CHECK-NEXT: 2 | void Test3::A::f() +// CHECK-NEXT: 3 | void Test3::B::g() +// CHECK-NEXT: 4 | void Test3::D::h() +struct D : B { + virtual void f(); + virtual void g(); + virtual void h(); +}; + +void D::f() { } } |