Compare canonical return types when generating MS C++ ABI vtable thunks
This was part of the cause for PR17655. We were generating thunks when we shouldn't have. I suspect that if we tweak the test case for PR17655 to actually require thunks, we can reproduce the same crash. llvm-svn: 197836
This commit is contained in:
parent
f30e848432
commit
d2d1cc5156
|
@ -2888,7 +2888,8 @@ void VFTableBuilder::AddMethods(BaseSubobject Base, unsigned BaseDepth,
|
||||||
AddThunk(MD, VTableThunks[OverriddenMethodInfo.VFTableIndex]);
|
AddThunk(MD, VTableThunks[OverriddenMethodInfo.VFTableIndex]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (MD->getResultType() == OverriddenMD->getResultType()) {
|
if (Context.hasSameType(MD->getResultType(),
|
||||||
|
OverriddenMD->getResultType())) {
|
||||||
// No return adjustment needed - just replace the overridden method info
|
// No return adjustment needed - just replace the overridden method info
|
||||||
// with the current info.
|
// with the current info.
|
||||||
MethodInfo MI(OverriddenMethodInfo.VBTableIndex,
|
MethodInfo MI(OverriddenMethodInfo.VBTableIndex,
|
||||||
|
|
|
@ -14,6 +14,7 @@
|
||||||
// RUN: FileCheck --check-prefix=CHECK-L %s < %t
|
// RUN: FileCheck --check-prefix=CHECK-L %s < %t
|
||||||
// RUN: FileCheck --check-prefix=CHECK-M %s < %t
|
// RUN: FileCheck --check-prefix=CHECK-M %s < %t
|
||||||
// RUN: FileCheck --check-prefix=CHECK-N %s < %t
|
// RUN: FileCheck --check-prefix=CHECK-N %s < %t
|
||||||
|
// RUN: FileCheck --check-prefix=CHECK-O %s < %t
|
||||||
|
|
||||||
struct A {
|
struct A {
|
||||||
// CHECK-A: VFTable for 'A' (3 entries)
|
// CHECK-A: VFTable for 'A' (3 entries)
|
||||||
|
@ -250,3 +251,13 @@ struct N {
|
||||||
};
|
};
|
||||||
|
|
||||||
N n;
|
N n;
|
||||||
|
|
||||||
|
typedef int int_type;
|
||||||
|
struct O { virtual int f(); };
|
||||||
|
struct P : O { virtual int_type f(); };
|
||||||
|
P p;
|
||||||
|
// CHECK-O: VFTable for 'O' in 'P' (1 entries)
|
||||||
|
// CHECK-O-NEXT: 0 | int_type P::f()
|
||||||
|
|
||||||
|
// CHECK-O: VFTable for 'O' (1 entries)
|
||||||
|
// CHECK-O-NEXT: 0 | int O::f()
|
||||||
|
|
Loading…
Reference in New Issue