From: Mike Stump Date: Thu, 13 Aug 2009 23:26:06 +0000 (+0000) Subject: We can't avoid doing the work to find all the indirect primary virtual X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=0880e75541899bc1cdd73c50eb549110b5916c59;p=clang We can't avoid doing the work to find all the indirect primary virtual base classes as we'll need that to layout the virtual bases... git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@78954 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/AST/RecordLayoutBuilder.cpp b/lib/AST/RecordLayoutBuilder.cpp index 7988106de5..9c56121ee1 100644 --- a/lib/AST/RecordLayoutBuilder.cpp +++ b/lib/AST/RecordLayoutBuilder.cpp @@ -116,9 +116,19 @@ void ASTRecordLayoutBuilder::SelectPrimaryVBase(const CXXRecordDecl *RD, } /// SelectPrimaryBase - Selects the primary base for the given class and -/// record that with setPrimaryBase. +/// record that with setPrimaryBase. We also calculate the IndirectPrimaries. void ASTRecordLayoutBuilder::SelectPrimaryBase(const CXXRecordDecl *RD, llvm::SmallSet &IndirectPrimary) { + // We compute all the primary virtual bases for all of our direct and + // indirect bases, and record all their primary virtual base classes. + const CXXRecordDecl *FirstPrimary = 0; + for (CXXRecordDecl::base_class_const_iterator i = RD->bases_begin(), + e = RD->bases_end(); i != e; ++i) { + const CXXRecordDecl *Base = + cast(i->getType()->getAs()->getDecl()); + SelectPrimaryForBase(Base, IndirectPrimary); + } + // The primary base is the first non-virtual indirect or direct base class, // if one exists. for (CXXRecordDecl::base_class_const_iterator i = RD->bases_begin(), @@ -140,19 +150,8 @@ void ASTRecordLayoutBuilder::SelectPrimaryBase(const CXXRecordDecl *RD, // If we have no virtual bases at this point, bail out as the searching below // is expensive. - if (RD->getNumVBases() == 0) { + if (RD->getNumVBases() == 0) return; - } - - // First, we compute all the primary virtual bases for all of our direct and - // indirect bases, and record all their primary virtual base classes. - const CXXRecordDecl *FirstPrimary = 0; - for (CXXRecordDecl::base_class_const_iterator i = RD->bases_begin(), - e = RD->bases_end(); i != e; ++i) { - const CXXRecordDecl *Base = - cast(i->getType()->getAs()->getDecl()); - SelectPrimaryForBase(Base, IndirectPrimary); - } // Then we can search for the first nearly empty virtual base itself. SelectPrimaryVBase(RD, FirstPrimary, IndirectPrimary); @@ -169,8 +168,6 @@ void ASTRecordLayoutBuilder::LayoutVirtualBase(const CXXRecordDecl *RD) { void ASTRecordLayoutBuilder::LayoutVirtualBases(const CXXRecordDecl *RD, llvm::SmallSet &IndirectPrimary) { - // FIXME: Calculate IndirectPrimary when !PrimaryBaseWasVirtual - // assert(PrimaryBaseWasVirtual && "FIXME: calculate IndirectPrimary"); for (CXXRecordDecl::base_class_const_iterator i = RD->bases_begin(), e = RD->bases_end(); i != e; ++i) { const CXXRecordDecl *Base = @@ -230,7 +227,6 @@ void ASTRecordLayoutBuilder::Layout(const RecordDecl *D) { LayoutVtable(RD, IndirectPrimary); // PrimaryBase goes first. if (PrimaryBase) { - // FIXME: We need all the primaries. if (PrimaryBaseWasVirtual) IndirectPrimary.insert(PrimaryBase); LayoutBaseNonVirtually(PrimaryBase);