From 6bb66bbd0661028ee007cbe62c7045a166ab95d4 Mon Sep 17 00:00:00 2001 From: Mike Stump <mrs@apple.com> Date: Thu, 13 Aug 2009 00:34:14 +0000 Subject: [PATCH] Refine virtual base layout. WIP. llvm-svn: 78873 --- clang/lib/AST/RecordLayoutBuilder.cpp | 2 +- clang/test/CodeGenCXX/virt.cpp | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/clang/lib/AST/RecordLayoutBuilder.cpp b/clang/lib/AST/RecordLayoutBuilder.cpp index 7f7a15a21635..0b56d774281b 100644 --- a/clang/lib/AST/RecordLayoutBuilder.cpp +++ b/clang/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<CXXRecordDecl>(i->getType()->getAs<RecordType>()->getDecl()); - if (Base != PrimaryBase) + if (!PrimaryBaseWasVirtual || Base != PrimaryBase) LayoutVirtualBase(Base); } } diff --git a/clang/test/CodeGenCXX/virt.cpp b/clang/test/CodeGenCXX/virt.cpp index 7a1e2c31edf2..0a8fb0eddae6 100644 --- a/clang/test/CodeGenCXX/virt.cpp +++ b/clang/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;