Improve this adjustment pointer calculation.

llvm-svn: 97067
diff --git a/clang/lib/CodeGen/CGVtable.cpp b/clang/lib/CodeGen/CGVtable.cpp
index f0a95b9..17c21f4 100644
--- a/clang/lib/CodeGen/CGVtable.cpp
+++ b/clang/lib/CodeGen/CGVtable.cpp
@@ -1432,12 +1432,23 @@
     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);
   }