switch MemberExpr to holding a field decl instead of a raw identifier.

llvm-svn: 38948
diff --git a/clang/AST/Expr.cpp b/clang/AST/Expr.cpp
index ffa5d3f..71415b7 100644
--- a/clang/AST/Expr.cpp
+++ b/clang/AST/Expr.cpp
@@ -119,7 +119,11 @@
 
 void MemberExpr::dump_impl() const {
   Base->dump();
-  std::cerr << (isArrow ? "->" : ".") << MemberII->getName();
+  std::cerr << (isArrow ? "->" : ".");
+  
+  if (MemberDecl)
+    /*TODO: Print MemberDecl*/;
+  std::cerr << "member";
 }
 
 /// getOpcodeStr - Turn an Opcode enum value into the punctuation char it
diff --git a/clang/AST/Sema.cpp b/clang/AST/Sema.cpp
index 7711d18..48c879d 100644
--- a/clang/AST/Sema.cpp
+++ b/clang/AST/Sema.cpp
@@ -211,11 +211,13 @@
 ParseMemberReferenceExpr(ExprTy *Base, SourceLocation OpLoc,
                          tok::TokenKind OpKind, SourceLocation MemberLoc,
                          IdentifierInfo &Member) {
+  Decl *MemberDecl = 0;
+  // TODO: Look up MemberDecl.
   if (!FullLocInfo)
-    return new MemberExpr((Expr*)Base, OpKind == tok::arrow, Member);
+    return new MemberExpr((Expr*)Base, OpKind == tok::arrow, MemberDecl);
   else
     return new MemberExprLOC((Expr*)Base, OpLoc, OpKind == tok::arrow,
-                             MemberLoc, Member);
+                             MemberLoc, MemberDecl);
 }
 
 /// ParseCallExpr - Handle a call to Fn with the specified array of arguments.
diff --git a/clang/Parse/ParseExpr.cpp b/clang/Parse/ParseExpr.cpp
index aae3e44..0d56cf8 100644
--- a/clang/Parse/ParseExpr.cpp
+++ b/clang/Parse/ParseExpr.cpp
@@ -559,7 +559,6 @@
 ///         argument-expression-list ',' assignment-expression
 ///
 Parser::ExprResult Parser::ParsePostfixExpressionSuffix(ExprResult LHS) {
-  assert(!LHS.isInvalid && "LHS is invalid already!");
   
   // Now that the primary-expression piece of the postfix-expression has been
   // parsed, see if there are any postfix-expression pieces here.
diff --git a/clang/Sema/Sema.cpp b/clang/Sema/Sema.cpp
index 7711d18..48c879d 100644
--- a/clang/Sema/Sema.cpp
+++ b/clang/Sema/Sema.cpp
@@ -211,11 +211,13 @@
 ParseMemberReferenceExpr(ExprTy *Base, SourceLocation OpLoc,
                          tok::TokenKind OpKind, SourceLocation MemberLoc,
                          IdentifierInfo &Member) {
+  Decl *MemberDecl = 0;
+  // TODO: Look up MemberDecl.
   if (!FullLocInfo)
-    return new MemberExpr((Expr*)Base, OpKind == tok::arrow, Member);
+    return new MemberExpr((Expr*)Base, OpKind == tok::arrow, MemberDecl);
   else
     return new MemberExprLOC((Expr*)Base, OpLoc, OpKind == tok::arrow,
-                             MemberLoc, Member);
+                             MemberLoc, MemberDecl);
 }
 
 /// ParseCallExpr - Handle a call to Fn with the specified array of arguments.
diff --git a/clang/include/clang/AST/Expr.h b/clang/include/clang/AST/Expr.h
index dc8d895..99c3f79 100644
--- a/clang/include/clang/AST/Expr.h
+++ b/clang/include/clang/AST/Expr.h
@@ -177,12 +177,11 @@
 ///
 class MemberExpr : public Expr {
   Expr *Base;
-  // TODO: union { Decl *MemberDecl; IdentifierInfo *MemberII; };
-  IdentifierInfo *MemberII;
+  Decl *MemberDecl;
   bool isArrow;      // True if this is "X->F", false if this is "X.F".
 public:
-  MemberExpr(Expr *base, bool isarrow, IdentifierInfo &memberii) 
-    : Base(base), MemberII(&memberii), isArrow(isarrow) {
+  MemberExpr(Expr *base, bool isarrow, Decl *memberdecl) 
+    : Base(base), MemberDecl(memberdecl), isArrow(isarrow) {
   }
   virtual void dump_impl() const;
 };
@@ -191,8 +190,8 @@
   SourceLocation OpLoc, MemberLoc;
 public:
   MemberExprLOC(Expr *Base, SourceLocation oploc, bool isArrow,
-                SourceLocation memberLoc, IdentifierInfo &MemberII) 
-    : MemberExpr(Base, isArrow, MemberII), OpLoc(oploc), MemberLoc(memberLoc) {
+                SourceLocation memberLoc, Decl *MemberDecl) 
+    : MemberExpr(Base, isArrow, MemberDecl), OpLoc(oploc), MemberLoc(memberLoc){
   }
 
 };
diff --git a/clang/include/clang/Parse/Action.h b/clang/include/clang/Parse/Action.h
index d459c56..c95ff11 100644
--- a/clang/include/clang/Parse/Action.h
+++ b/clang/include/clang/Parse/Action.h
@@ -57,6 +57,8 @@
     bool isInvalid;
     
     ExprResult(bool Invalid = false) : Val(0), isInvalid(Invalid) {}
+    template<typename ActualExprTy>
+    ExprResult(ActualExprTy *val) : Val(val), isInvalid(false) {}
     
     const ExprResult &operator=(ExprTy *RHS) {
       Val = RHS;