Patch for ObjCIvarRefExpr containing the field
matching the storage layout for this ivar
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@60996 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp
index 264b85b..98afb0f 100644
--- a/lib/Sema/SemaExpr.cpp
+++ b/lib/Sema/SemaExpr.cpp
@@ -418,11 +418,12 @@
if (SD == 0 || SD->isDefinedOutsideFunctionOrMethod()) {
ObjCInterfaceDecl *IFace = getCurMethodDecl()->getClassInterface();
if (ObjCIvarDecl *IV = IFace->lookupInstanceVariable(II)) {
+ FieldDecl *FD = IFace->lookupFieldDeclForIvar(Context, IV);
// FIXME: This should use a new expr for a direct reference, don't turn
// this into Self->ivar, just return a BareIVarExpr or something.
IdentifierInfo &II = Context.Idents.get("self");
ExprResult SelfExpr = ActOnIdentifierExpr(S, Loc, II, false);
- return new ObjCIvarRefExpr(IV, IV->getType(), Loc,
+ return new ObjCIvarRefExpr(IV, FD, IV->getType(), Loc,
static_cast<Expr*>(SelfExpr.Val), true, true);
}
}
@@ -1264,9 +1265,11 @@
// Handle access to Objective-C instance variables, such as "Obj->ivar" and
// (*Obj).ivar.
if (const ObjCInterfaceType *IFTy = BaseType->getAsObjCInterfaceType()) {
- if (ObjCIvarDecl *IV = IFTy->getDecl()->lookupInstanceVariable(&Member))
- return new ObjCIvarRefExpr(IV, IV->getType(), MemberLoc, BaseExpr,
+ if (ObjCIvarDecl *IV = IFTy->getDecl()->lookupInstanceVariable(&Member)) {
+ FieldDecl *FD = IFTy->getDecl()->lookupFieldDeclForIvar(Context, IV);
+ return new ObjCIvarRefExpr(IV, FD, IV->getType(), MemberLoc, BaseExpr,
OpKind == tok::arrow);
+ }
return Diag(MemberLoc, diag::err_typecheck_member_reference_ivar)
<< IFTy->getDecl()->getDeclName() << &Member
<< BaseExpr->getSourceRange();