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.