When re-using a vtable slot for the nearest overridden method, just because
there's no return adjustment from the overridden to the overrider doesn't mean there isn't a return adjustment from the overrider to the final overrider. This matters if we're emitting a virtual this-adjustment thunk because the overrider virtually inherits from the class providing the nearest overridden method. Do the appropriate return adjustment in this case. Fixes PR7611. llvm-svn: 118466
This commit is contained in:
@@ -1664,9 +1664,18 @@ VTableBuilder::AddMethods(BaseSubobject Base, uint64_t BaseOffsetInLayoutClass,
|
||||
|
||||
if (ThisAdjustment.VCallOffsetOffset &&
|
||||
Overrider.Method->getParent() == MostDerivedClass) {
|
||||
|
||||
// There's no return adjustment from OverriddenMD and MD,
|
||||
// but that doesn't mean there isn't one between MD and
|
||||
// the final overrider.
|
||||
BaseOffset ReturnAdjustmentOffset =
|
||||
ComputeReturnAdjustmentBaseOffset(Context, Overrider.Method, MD);
|
||||
ReturnAdjustment ReturnAdjustment =
|
||||
ComputeReturnAdjustment(ReturnAdjustmentOffset);
|
||||
|
||||
// This is a virtual thunk for the most derived class, add it.
|
||||
AddThunk(Overrider.Method,
|
||||
ThunkInfo(ThisAdjustment, ReturnAdjustment()));
|
||||
ThunkInfo(ThisAdjustment, ReturnAdjustment));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user