From 2b381bbb5c7810ab72b664bb7ee57f7153508246 Mon Sep 17 00:00:00 2001 From: Anders Carlsson Date: Sat, 27 Feb 2010 18:16:50 +0000 Subject: [PATCH] Don't add this adjustments for pure virtual member functions. llvm-svn: 97334 --- clang/lib/CodeGen/CGVtable.cpp | 8 ++++-- clang/test/CodeGenCXX/vtable-layout.cpp | 35 ++++++++++++++++++++++++- 2 files changed, 40 insertions(+), 3 deletions(-) diff --git a/clang/lib/CodeGen/CGVtable.cpp b/clang/lib/CodeGen/CGVtable.cpp index 6fb70d83c2da..8e9e0655e8d2 100644 --- a/clang/lib/CodeGen/CGVtable.cpp +++ b/clang/lib/CodeGen/CGVtable.cpp @@ -1315,8 +1315,12 @@ void VtableBuilder::ComputeThisAdjustments() { continue; uint64_t VtableIndex = MethodInfo.VtableIndex; - - // Ignore this adjustments for unused function pointers. + + // Ignore adjustments for pure virtual member functions. + if (Overrider.Method->isPure()) + continue; + + // Ignore adjustments for unused function pointers. if (Components[VtableIndex].getKind() == VtableComponent::CK_UnusedFunctionPointer) continue; diff --git a/clang/test/CodeGenCXX/vtable-layout.cpp b/clang/test/CodeGenCXX/vtable-layout.cpp index 655f6063d9e7..301cd58e9889 100644 --- a/clang/test/CodeGenCXX/vtable-layout.cpp +++ b/clang/test/CodeGenCXX/vtable-layout.cpp @@ -753,4 +753,37 @@ struct D : C, B, virtual A { }; void D::f() { } -} \ No newline at end of file +} + +namespace Test20 { + +// pure virtual member functions should never have 'this' adjustments. + +struct A { + virtual void f() = 0; + virtual void g(); +}; + +struct B : A { }; + +// CHECK: Vtable for 'Test20::C' (9 entries). +// CHECK-NEXT: 0 | offset_to_top (0) +// CHECK-NEXT: 1 | Test20::C RTTI +// CHECK-NEXT: -- (Test20::A, 0) vtable address -- +// CHECK-NEXT: -- (Test20::C, 0) vtable address -- +// CHECK-NEXT: 2 | void Test20::C::f() [pure] +// CHECK-NEXT: 3 | void Test20::A::g() +// CHECK-NEXT: 4 | void Test20::C::h() +// CHECK-NEXT: 5 | offset_to_top (-8) +// CHECK-NEXT: 6 | Test20::C RTTI +// CHECK-NEXT: -- (Test20::A, 8) vtable address -- +// CHECK-NEXT: -- (Test20::B, 8) vtable address -- +// CHECK-NEXT: 7 | void Test20::C::f() [pure] +// CHECK-NEXT: 8 | void Test20::A::g() +struct C : A, B { + virtual void f() = 0; + virtual void h(); +}; +void C::h() { } + +}