From: Anders Carlsson Date: Tue, 22 Sep 2009 19:16:59 +0000 (+0000) Subject: If we already set a primary base, don't set it to the first nearly empty base class. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=56cfdc183e6012201c7e0a45b04fe74fd1ab51e4;p=clang If we already set a primary base, don't set it to the first nearly empty base class. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@82563 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/AST/RecordLayoutBuilder.cpp b/lib/AST/RecordLayoutBuilder.cpp index 836e43c43a..8a3e08965f 100644 --- a/lib/AST/RecordLayoutBuilder.cpp +++ b/lib/AST/RecordLayoutBuilder.cpp @@ -158,8 +158,8 @@ void ASTRecordLayoutBuilder::SelectPrimaryBase(const CXXRecordDecl *RD) { // Otherwise if is the first nearly empty virtual base, if one exists, // otherwise there is no primary base class. - setPrimaryBase(FirstPrimary, true); - return; + if (!PrimaryBase) + setPrimaryBase(FirstPrimary, true); } void ASTRecordLayoutBuilder::LayoutVirtualBase(const CXXRecordDecl *RD) { diff --git a/test/SemaCXX/primary-base.cpp b/test/SemaCXX/primary-base.cpp new file mode 100644 index 0000000000..62f9087bd9 --- /dev/null +++ b/test/SemaCXX/primary-base.cpp @@ -0,0 +1,11 @@ +// RUN: clang-cc -fsyntax-only -verify %s +class A { virtual void f(); }; +class B : virtual A { }; + +class C : B { }; + +// Since A is already a primary base class, C should be the primary base class of F. +class F : virtual A, virtual C { }; + +int sa[sizeof(F) == sizeof(A) ? 1 : -1]; +