Calculate the value kind of an expression when it's created and
store it on the expression node.  Also store an "object kind",
which distinguishes ordinary "addressed" l-values (like
variable references and pointer dereferences) and bitfield,
@property, and vector-component l-values.

Currently we're not using these for much, but I aim to switch
pretty much everything calculating l-valueness over to them.
For now they shouldn't necessarily be trusted.



git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@119685 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/CodeGen/CGBlocks.cpp b/lib/CodeGen/CGBlocks.cpp
index c40cfaf..8f3e0a6 100644
--- a/lib/CodeGen/CGBlocks.cpp
+++ b/lib/CodeGen/CGBlocks.cpp
@@ -161,7 +161,7 @@
   if (Info.NeedsObjCSelf) {
     ValueDecl *Self = cast<ObjCMethodDecl>(CGF.CurFuncDecl)->getSelfDecl();
     BlockDeclRefExpr *BDRE =
-      new (CGF.getContext()) BlockDeclRefExpr(Self, Self->getType(),
+      new (CGF.getContext()) BlockDeclRefExpr(Self, Self->getType(), VK_RValue,
                                               SourceLocation(), false);
     Info.DeclRefs.push_back(BDRE);
     CGF.AllocateBlockDecl(BDRE);
@@ -344,26 +344,26 @@
           if (BDRE->getCopyConstructorExpr()) {
             E = BDRE->getCopyConstructorExpr();
             PushDestructorCleanup(E->getType(), Addr);
-          }
-            else {
-              E = new (getContext()) DeclRefExpr(const_cast<ValueDecl*>(VD),
-                                            VD->getType().getNonReferenceType(),
-                                            SourceLocation());
-              if (VD->getType()->isReferenceType()) {
-                E = new (getContext())
-                    UnaryOperator(const_cast<Expr*>(E), UO_AddrOf,
-                                getContext().getPointerType(E->getType()),
-                                SourceLocation());
-              } 
+          } else {
+            E = new (getContext()) DeclRefExpr(const_cast<ValueDecl*>(VD),
+                                 VD->getType().getNonReferenceType(),
+                                 Expr::getValueKindForType(VD->getType()),
+                                 SourceLocation());
+            if (VD->getType()->isReferenceType()) {
+              E = new (getContext())
+                UnaryOperator(const_cast<Expr*>(E), UO_AddrOf,
+                              getContext().getPointerType(E->getType()),
+                              VK_RValue, OK_Ordinary, SourceLocation());
             }
           }
         }
+      }
 
       if (BDRE->isByRef()) {
         E = new (getContext())
           UnaryOperator(const_cast<Expr*>(E), UO_AddrOf,
                         getContext().getPointerType(E->getType()),
-                        SourceLocation());
+                        VK_RValue, OK_Ordinary, SourceLocation());
       }
 
       RValue r = EmitAnyExpr(E, AggValueSlot::forAddr(Addr, false, true));
@@ -932,7 +932,7 @@
                                          0, QualType(PadTy), 0,
                                          SC_None, SC_None);
     Expr *E = new (getContext()) DeclRefExpr(PadDecl, PadDecl->getType(),
-                                             SourceLocation());
+                                             VK_LValue, SourceLocation());
     BlockLayout.push_back(E);
   }
 
diff --git a/lib/CodeGen/CGObjC.cpp b/lib/CodeGen/CGObjC.cpp
index 7c2dfe8..13f4d8f 100644
--- a/lib/CodeGen/CGObjC.cpp
+++ b/lib/CodeGen/CGObjC.cpp
@@ -393,9 +393,9 @@
     SourceLocation Loc = PD->getLocation();
     ValueDecl *Self = OMD->getSelfDecl();
     ObjCIvarDecl *Ivar = PID->getPropertyIvarDecl();
-    DeclRefExpr Base(Self, Self->getType(), Loc);
+    DeclRefExpr Base(Self, Self->getType(), VK_RValue, Loc);
     ParmVarDecl *ArgDecl = *OMD->param_begin();
-    DeclRefExpr Arg(ArgDecl, ArgDecl->getType(), Loc);
+    DeclRefExpr Arg(ArgDecl, ArgDecl->getType(), VK_LValue, Loc);
     ObjCIvarRefExpr IvarRef(Ivar, Ivar->getType(), Loc, &Base, true, true);
     
     // The property type can differ from the ivar type in some situations with
@@ -406,11 +406,11 @@
                                  Ivar->getType(), CK_BitCast, &Arg,
                                  VK_RValue);
       BinaryOperator Assign(&IvarRef, &ArgCasted, BO_Assign,
-                            Ivar->getType(), Loc);
+                            Ivar->getType(), VK_RValue, OK_Ordinary, Loc);
       EmitStmt(&Assign);
     } else {
       BinaryOperator Assign(&IvarRef, &Arg, BO_Assign,
-                            Ivar->getType(), Loc);
+                            Ivar->getType(), VK_RValue, OK_Ordinary, Loc);
       EmitStmt(&Assign);
     }
   }