aboutsummaryrefslogtreecommitdiff
path: root/lib/CodeGen/CGVtable.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/CodeGen/CGVtable.cpp')
-rw-r--r--lib/CodeGen/CGVtable.cpp21
1 files changed, 16 insertions, 5 deletions
diff --git a/lib/CodeGen/CGVtable.cpp b/lib/CodeGen/CGVtable.cpp
index f0a95b92da..17c21f40f9 100644
--- a/lib/CodeGen/CGVtable.cpp
+++ b/lib/CodeGen/CGVtable.cpp
@@ -1432,12 +1432,23 @@ VtableBuilder::AddMethods(BaseSubobject Base,
ReturnAdjustment ReturnAdjustment =
ComputeReturnAdjustment(ReturnAdjustmentOffset);
- // Check if this overrider needs a 'this' pointer adjustment.
- BaseOffset ThisAdjustmentOffset =
- Overriders.getThisAdjustmentOffset(Base, MD);
+ ThisAdjustment ThisAdjustment;
- ThisAdjustment ThisAdjustment = ComputeThisAdjustment(Overrider.Method,
- ThisAdjustmentOffset);
+ // Check if this overrider needs a 'this' pointer adjustment.
+ // (We use the base offset of the first base in the primary base chain here,
+ // because Base will not have the right offset if it is a primary virtual
+ // base that is not a primary base in the complete class.
+ if (FirstBaseInPrimaryBaseChain.getBaseOffset() != Overrider.BaseOffset) {
+ BaseSubobject OverriderBaseSubobject(Overrider.Method->getParent(),
+ Overrider.BaseOffset);
+
+ BaseOffset ThisAdjustmentOffset =
+ Overriders.ComputeThisAdjustmentBaseOffset(FirstBaseInPrimaryBaseChain,
+ OverriderBaseSubobject);
+
+ ThisAdjustment = ComputeThisAdjustment(Overrider.Method,
+ ThisAdjustmentOffset);
+ }
AddMethod(Overrider.Method, ReturnAdjustment, ThisAdjustment);
}