]> granicus.if.org Git - clang/commitdiff
Handle primary bases in AddVCallOffsets.
authorAnders Carlsson <andersca@mac.com>
Wed, 17 Feb 2010 06:30:02 +0000 (06:30 +0000)
committerAnders Carlsson <andersca@mac.com>
Wed, 17 Feb 2010 06:30:02 +0000 (06:30 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@96461 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CGVtable.cpp

index 2b8b064f2683b79a6805c22e56cb5f28634aecf8..58989ede0bc98c617f71d47010ac408285838c11 100644 (file)
@@ -985,10 +985,17 @@ VtableBuilder::AddVCallAndVBaseOffsets(BaseSubobject Base,
 
 void VtableBuilder::AddVCallOffsets(BaseSubobject Base) {
   const CXXRecordDecl *RD = Base.getBase();
-  
   const ASTRecordLayout &Layout = Context.getASTRecordLayout(RD);
+
+  // Handle the primary base first.
   const CXXRecordDecl *PrimaryBase = Layout.getPrimaryBase();
-  assert(!PrimaryBase && "FIXME: Handle the primary base!");
+  if (PrimaryBase && Layout.getPrimaryBaseWasVirtual()) {
+    // Get the base offset of the primary base.
+    uint64_t PrimaryBaseOffset = Base.getBaseOffset() + 
+      Layout.getBaseClassOffset(PrimaryBase);
+    
+    AddVCallOffsets(BaseSubobject(PrimaryBase, PrimaryBaseOffset));
+  }
 
   // Add the vcall offsets.
   for (CXXRecordDecl::method_iterator I = RD->method_begin(),