Patch to do statically typed ivar references.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@44028 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/Sema/SemaExpr.cpp b/Sema/SemaExpr.cpp
index d51a296..8f816e6 100644
--- a/Sema/SemaExpr.cpp
+++ b/Sema/SemaExpr.cpp
@@ -519,9 +519,20 @@
if (ret.isNull())
return true;
return new OCUVectorElementExpr(ret, BaseExpr, Member, MemberLoc);
- } else
- return Diag(OpLoc, diag::err_typecheck_member_reference_structUnion,
- SourceRange(MemberLoc));
+ } else if (BaseType->isObjcInterfaceType()) {
+ ObjcInterfaceDecl *IFace;
+ if (isa<ObjcInterfaceType>(BaseType.getCanonicalType()))
+ IFace = dyn_cast<ObjcInterfaceType>(BaseType)->getDecl();
+ else
+ IFace = dyn_cast<ObjcQualifiedInterfaceType>(BaseType)
+ ->getInterfaceType()->getDecl();
+ ObjcInterfaceDecl *clsDeclared;
+ if (ObjcIvarDecl *IV = IFace->lookupInstanceVariable(&Member, clsDeclared))
+ return new ObjCIvarRefExpr(IV, IV->getType(), MemberLoc, BaseExpr,
+ OpKind==tok::arrow);
+ }
+ return Diag(OpLoc, diag::err_typecheck_member_reference_structUnion,
+ SourceRange(MemberLoc));
}
/// ActOnCallExpr - Handle a call to Fn with the specified array of arguments.