forked from OSchip/llvm-project
More cleanup of data member access and then some.
llvm-svn: 77351
This commit is contained in:
parent
d6b4b29706
commit
a399dfae19
|
@ -168,16 +168,23 @@ llvm::Value *CodeGenFunction::AddressCXXOfBaseClass(llvm::Value *BaseValue,
|
|||
getContext().getASTRecordLayout(ClassDecl);
|
||||
llvm::Type *I8Ptr = VMContext.getPointerTypeUnqual(llvm::Type::Int8Ty);
|
||||
unsigned Idx = 0;
|
||||
bool DerivedToBaseConversion = false;
|
||||
for (CXXRecordDecl::base_class_const_iterator i =
|
||||
ClassDecl->bases_begin(),
|
||||
e = ClassDecl->bases_end(); i != e; ++i, ++Idx) {
|
||||
if (!i->isVirtual()) {
|
||||
const CXXRecordDecl *Base =
|
||||
cast<CXXRecordDecl>(i->getType()->getAsRecordType()->getDecl());
|
||||
if (Base == BaseClassDecl)
|
||||
break;
|
||||
if (Base == BaseClassDecl) {
|
||||
DerivedToBaseConversion = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!DerivedToBaseConversion) {
|
||||
assert(false && "FIXME - Only derived to imm. base convesion is supported");
|
||||
return BaseValue;
|
||||
}
|
||||
uint64_t Offset = Layout.getFieldOffset(Idx) / 8;
|
||||
llvm::Value *OffsetVal = llvm::ConstantInt::get(llvm::Type::Int32Ty, Offset);
|
||||
BaseValue = Builder.CreateBitCast(BaseValue, I8Ptr);
|
||||
|
|
|
@ -993,15 +993,14 @@ LValue CodeGenFunction::EmitMemberExpr(const MemberExpr *E) {
|
|||
if (PTy->getPointeeType()->isUnionType())
|
||||
isUnion = true;
|
||||
CVRQualifiers = PTy->getPointeeType().getCVRQualifiers();
|
||||
if (CXXThisExpr *ThisExpr = dyn_cast<CXXThisExpr>(BaseExpr)) {
|
||||
QualType ClassTy = ThisExpr->getType();
|
||||
ClassTy = ClassTy->getPointeeType();
|
||||
CXXRecordDecl *ClassDecl =
|
||||
cast<CXXRecordDecl>(ClassTy->getAsRecordType()->getDecl());
|
||||
QualType ClassTy = BaseExpr->getType();
|
||||
ClassTy = ClassTy->getPointeeType();
|
||||
if (CXXRecordDecl *ClassDecl =
|
||||
dyn_cast<CXXRecordDecl>(ClassTy->getAsRecordType()->getDecl())) {
|
||||
FieldDecl *Field = dyn_cast<FieldDecl>(E->getMemberDecl());
|
||||
CXXRecordDecl *BaseClassDecl =
|
||||
cast<CXXRecordDecl>(Field->getDeclContext());
|
||||
BaseValue = AddressCXXOfBaseClass(BaseValue, ClassDecl, BaseClassDecl);
|
||||
if (CXXRecordDecl *BaseClassDecl =
|
||||
dyn_cast<CXXRecordDecl>(Field->getDeclContext()))
|
||||
BaseValue = AddressCXXOfBaseClass(BaseValue, ClassDecl, BaseClassDecl);
|
||||
}
|
||||
} else if (isa<ObjCPropertyRefExpr>(BaseExpr) ||
|
||||
isa<ObjCKVCRefExpr>(BaseExpr)) {
|
||||
|
@ -1021,6 +1020,15 @@ LValue CodeGenFunction::EmitMemberExpr(const MemberExpr *E) {
|
|||
if (BaseExpr->getType()->isUnionType())
|
||||
isUnion = true;
|
||||
CVRQualifiers = BaseExpr->getType().getCVRQualifiers();
|
||||
if (CXXRecordDecl *ClassDecl =
|
||||
dyn_cast<CXXRecordDecl>(
|
||||
BaseExpr->getType()->getAsRecordType()->getDecl())) {
|
||||
FieldDecl *Field = dyn_cast<FieldDecl>(E->getMemberDecl());
|
||||
if (CXXRecordDecl *BaseClassDecl =
|
||||
dyn_cast<CXXRecordDecl>(Field->getDeclContext()))
|
||||
BaseValue =
|
||||
AddressCXXOfBaseClass(BaseValue, ClassDecl, BaseClassDecl);
|
||||
}
|
||||
}
|
||||
|
||||
FieldDecl *Field = dyn_cast<FieldDecl>(E->getMemberDecl());
|
||||
|
|
|
@ -38,6 +38,9 @@ struct N : M , P, Q {
|
|||
printf("iQ = %d\n", iQ);
|
||||
printf("iP = %d\n", iP);
|
||||
printf("iM = %d\n", iM);
|
||||
printf("iQ = %d\n", (*this).iQ);
|
||||
printf("iP = %d\n", ((*this)).iP);
|
||||
printf("iM = %d\n", this->iM);
|
||||
}
|
||||
float ld;
|
||||
float ff;
|
||||
|
|
Loading…
Reference in New Issue