From: Mike Stump Date: Thu, 13 Aug 2009 00:34:14 +0000 (+0000) Subject: Refine virtual base layout. WIP. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=94d0bceeb3afd82293326261c793b45023fd3cab;p=clang Refine virtual base layout. WIP. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@78873 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/AST/RecordLayoutBuilder.cpp b/lib/AST/RecordLayoutBuilder.cpp index 7f7a15a216..0b56d77428 100644 --- a/lib/AST/RecordLayoutBuilder.cpp +++ b/lib/AST/RecordLayoutBuilder.cpp @@ -173,7 +173,7 @@ void ASTRecordLayoutBuilder::LayoutVirtualBases(const CXXRecordDecl *RD) { e = RD->vbases_end(); i != e; ++i) { const CXXRecordDecl *Base = cast(i->getType()->getAs()->getDecl()); - if (Base != PrimaryBase) + if (!PrimaryBaseWasVirtual || Base != PrimaryBase) LayoutVirtualBase(Base); } } diff --git a/test/CodeGenCXX/virt.cpp b/test/CodeGenCXX/virt.cpp index 7a1e2c31ed..0a8fb0edda 100644 --- a/test/CodeGenCXX/virt.cpp +++ b/test/CodeGenCXX/virt.cpp @@ -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;