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;