]> granicus.if.org Git - clang/commitdiff
Refine virtual base layout. WIP.
authorMike Stump <mrs@apple.com>
Thu, 13 Aug 2009 00:34:14 +0000 (00:34 +0000)
committerMike Stump <mrs@apple.com>
Thu, 13 Aug 2009 00:34:14 +0000 (00:34 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@78873 91177308-0d34-0410-b5e6-96231b3b80d8

lib/AST/RecordLayoutBuilder.cpp
test/CodeGenCXX/virt.cpp

index 7f7a15a21635a460d3717526f27319354d323bbd..0b56d774281b52218eceb05f2a71ecfa11e02757 100644 (file)
@@ -173,7 +173,7 @@ void ASTRecordLayoutBuilder::LayoutVirtualBases(const CXXRecordDecl *RD) {
          e = RD->vbases_end(); i != e; ++i) {
     const CXXRecordDecl *Base = 
       cast<CXXRecordDecl>(i->getType()->getAs<RecordType>()->getDecl());
-    if (Base != PrimaryBase)
+    if (!PrimaryBaseWasVirtual || Base != PrimaryBase)
       LayoutVirtualBase(Base);
   }
 }
index 7a1e2c31edf21e3039c5c2247793cb308943d306..0a8fb0eddae608c5452cffe4f418a51b26110785 100644 (file)
@@ -92,6 +92,17 @@ int main() {
 // CHECK-LP64: movl $2, 8(%rax)
 
 
+struct test6_B2 { virtual void funcB2(); char b[1000]; };
+struct test6_B1 : virtual test6_B2 { virtual void funcB1(); };
+
+struct test6_D : test6_B2, virtual test6_B1 {
+};
+
+// CEHCK-LP32: .zerofill __DATA, __common, _d6, 2012, 4
+// CHECK-LP64: .zerofill __DATA, __common, _d6, 2024, 4
+
+
+
 struct test3_B3 { virtual void funcB3(); };
 struct test3_B2 : virtual test3_B3 { virtual void funcB2(); };
 struct test3_B1 : virtual test3_B2 { virtual void funcB1(); };
@@ -370,6 +381,7 @@ struct test5_D  : virtual test5_B1, virtual test5_B21, virtual test5_B31 {
 // CHECK-LP64: .quad __ZN2D14bar5Ev
 
 
+test6_D d6;
 test5_D d5;
 test4_D d4;
 test3_D d3;