forked from OSchip/llvm-project
More cleanup towards fixing the real bug.
llvm-svn: 98232
This commit is contained in:
parent
6a84889d3f
commit
f7b7a1e781
|
@ -221,14 +221,16 @@ ASTRecordLayoutBuilder::LayoutVirtualBases(const CXXRecordDecl *Class,
|
||||||
const CXXRecordDecl *RD,
|
const CXXRecordDecl *RD,
|
||||||
const CXXRecordDecl *PB,
|
const CXXRecordDecl *PB,
|
||||||
uint64_t Offset) {
|
uint64_t Offset) {
|
||||||
for (CXXRecordDecl::base_class_const_iterator i = RD->bases_begin(),
|
|
||||||
e = RD->bases_end(); i != e; ++i) {
|
for (CXXRecordDecl::base_class_const_iterator I = RD->bases_begin(),
|
||||||
assert(!i->getType()->isDependentType() &&
|
E = RD->bases_end(); I != E; ++I) {
|
||||||
|
assert(!I->getType()->isDependentType() &&
|
||||||
"Cannot layout class with dependent bases.");
|
"Cannot layout class with dependent bases.");
|
||||||
|
|
||||||
const CXXRecordDecl *Base =
|
const CXXRecordDecl *Base =
|
||||||
cast<CXXRecordDecl>(i->getType()->getAs<RecordType>()->getDecl());
|
cast<CXXRecordDecl>(I->getType()->getAs<RecordType>()->getDecl());
|
||||||
uint64_t BaseOffset = Offset;
|
|
||||||
if (i->isVirtual()) {
|
if (I->isVirtual()) {
|
||||||
if (Base == PB) {
|
if (Base == PB) {
|
||||||
// Only lay things out once.
|
// Only lay things out once.
|
||||||
if (VisitedVirtualBases.count(Base))
|
if (VisitedVirtualBases.count(Base))
|
||||||
|
@ -251,22 +253,33 @@ ASTRecordLayoutBuilder::LayoutVirtualBases(const CXXRecordDecl *Class,
|
||||||
// Mark it so we don't lay it out twice.
|
// Mark it so we don't lay it out twice.
|
||||||
VisitedVirtualBases.insert(Base);
|
VisitedVirtualBases.insert(Base);
|
||||||
LayoutVirtualBase(Base);
|
LayoutVirtualBase(Base);
|
||||||
BaseOffset = VBases[Base];
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (RD == Class)
|
|
||||||
BaseOffset = getBaseOffset(Base);
|
|
||||||
else {
|
|
||||||
const ASTRecordLayout &Layout = Ctx.getASTRecordLayout(RD);
|
|
||||||
BaseOffset = Offset + Layout.getBaseClassOffset(Base);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Base->getNumVBases()) {
|
if (!Base->getNumVBases()) {
|
||||||
const ASTRecordLayout &Layout = Ctx.getASTRecordLayout(Base);
|
// This base isn't interesting since it doesn't have any virtual bases.
|
||||||
const CXXRecordDecl *PrimaryBase = Layout.getPrimaryBaseInfo().getBase();
|
continue;
|
||||||
LayoutVirtualBases(Class, Base, PrimaryBase, BaseOffset);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Compute the offset of this base.
|
||||||
|
uint64_t BaseOffset;
|
||||||
|
|
||||||
|
if (I->isVirtual()) {
|
||||||
|
// We want the vbase offset from the class we're currently laying out.
|
||||||
|
assert(VBases.count(Base) && "Did not find virtual base!");
|
||||||
|
BaseOffset = VBases[Base];
|
||||||
|
} else if (RD == Class) {
|
||||||
|
// We want the base offset from the class we're currently laying out.
|
||||||
|
assert(Bases.count(Base) && "Did not find base!");
|
||||||
|
BaseOffset = Bases[Base];
|
||||||
|
} else {
|
||||||
|
const ASTRecordLayout &Layout = Ctx.getASTRecordLayout(RD);
|
||||||
|
BaseOffset = Offset + Layout.getBaseClassOffset(Base);
|
||||||
|
}
|
||||||
|
|
||||||
|
const ASTRecordLayout &Layout = Ctx.getASTRecordLayout(Base);
|
||||||
|
const CXXRecordDecl *PrimaryBase = Layout.getPrimaryBaseInfo().getBase();
|
||||||
|
LayoutVirtualBases(Class, Base, PrimaryBase, BaseOffset);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue