Browse Source

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.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@197836 91177308-0d34-0410-b5e6-96231b3b80d8
Reid Kleckner 11 years ago
parent
commit
97679f3c8c

+ 2 - 1
lib/AST/VTableBuilder.cpp

@@ -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,

+ 11 - 0
test/CodeGenCXX/microsoft-abi-vtables-single-inheritance.cpp

@@ -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()