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:
Reid Kleckner 2013-12-20 21:44:05 +00:00
parent f30e848432
commit d2d1cc5156
2 changed files with 13 additions and 1 deletions

View File

@ -2888,7 +2888,8 @@ void VFTableBuilder::AddMethods(BaseSubobject Base, unsigned BaseDepth,
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
// with the current info.
MethodInfo MI(OverriddenMethodInfo.VBTableIndex,

View File

@ -14,6 +14,7 @@
// RUN: FileCheck --check-prefix=CHECK-L %s < %t
// RUN: FileCheck --check-prefix=CHECK-M %s < %t
// RUN: FileCheck --check-prefix=CHECK-N %s < %t
// RUN: FileCheck --check-prefix=CHECK-O %s < %t
struct A {
// CHECK-A: VFTable for 'A' (3 entries)
@ -250,3 +251,13 @@ struct 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()