Initial support for Obj-C dot-syntax for getters.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@55410 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/CodeGen/CGExprScalar.cpp b/lib/CodeGen/CGExprScalar.cpp
index 11d1e8d..cee8852 100644
--- a/lib/CodeGen/CGExprScalar.cpp
+++ b/lib/CodeGen/CGExprScalar.cpp
@@ -134,14 +134,20 @@
       return llvm::ConstantInt::get(EC->getInitVal());
     return EmitLoadOfLValue(E);
   }
-  Value *VisitObjCSelectorExpr(ObjCSelectorExpr *E);
-  Value *VisitObjCProtocolExpr(ObjCProtocolExpr *E);
-  Value *VisitObjCIvarRefExpr(ObjCIvarRefExpr *E) { return EmitLoadOfLValue(E);}
+  Value *VisitObjCSelectorExpr(ObjCSelectorExpr *E) { 
+    return CGF.EmitObjCSelectorExpr(E); 
+  }
+  Value *VisitObjCProtocolExpr(ObjCProtocolExpr *E) { 
+    return CGF.EmitObjCProtocolExpr(E); 
+  }
+  Value *VisitObjCIvarRefExpr(ObjCIvarRefExpr *E) { 
+    return EmitLoadOfLValue(E);
+  }
   Value *VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
-    CGF.ErrorUnsupported(E, "scalar expression (Objective-C property reference)");
-    if (E->getType()->isVoidType())
-      return 0;
-    return llvm::UndefValue::get(CGF.ConvertType(E->getType()));    
+    return CGF.EmitObjCPropertyGet(E).getScalarVal();
+  }
+  Value *VisitObjCMessageExpr(ObjCMessageExpr *E) {
+    return CGF.EmitObjCMessageExpr(E).getScalarVal();
   }
 
   Value *VisitArraySubscriptExpr(ArraySubscriptExpr *E);
@@ -196,10 +202,6 @@
     return CGF.EmitCallExpr(E).getScalarVal();
   }
 
-  Value *VisitObjCMessageExpr(ObjCMessageExpr *E) {
-    return CGF.EmitObjCMessageExpr(E).getScalarVal();
-  }
-
   Value *VisitStmtExpr(const StmtExpr *E);
   
   // Unary Operators.
@@ -481,14 +483,6 @@
   return Builder.CreateShuffleVector(V1, V2, SV, "shuffle");
 }
 
-Value *ScalarExprEmitter::VisitObjCSelectorExpr(ObjCSelectorExpr *E) {
-  return CGF.EmitObjCSelectorExpr(E);
-}
-
-Value *ScalarExprEmitter::VisitObjCProtocolExpr(ObjCProtocolExpr *E) {
-  return CGF.EmitObjCProtocolExpr(E);
-}
-
 Value *ScalarExprEmitter::VisitArraySubscriptExpr(ArraySubscriptExpr *E) {
   // Emit subscript expressions in rvalue context's.  For most cases, this just
   // loads the lvalue formed by the subscript expr.  However, we have to be