parent
e3d1ab29da
commit
e46504b278
|
|
@ -923,6 +923,10 @@ bool ChooseExpr::isConditionTrue(ASTContext &C) const {
|
|||
Stmt::child_iterator DeclRefExpr::child_begin() { return child_iterator(); }
|
||||
Stmt::child_iterator DeclRefExpr::child_end() { return child_iterator(); }
|
||||
|
||||
// ObjCIvarRefExpr
|
||||
Stmt::child_iterator ObjCIvarRefExpr::child_begin() { return child_iterator(); }
|
||||
Stmt::child_iterator ObjCIvarRefExpr::child_end() { return child_iterator(); }
|
||||
|
||||
// PreDefinedExpr
|
||||
Stmt::child_iterator PreDefinedExpr::child_begin() { return child_iterator(); }
|
||||
Stmt::child_iterator PreDefinedExpr::child_end() { return child_iterator(); }
|
||||
|
|
|
|||
|
|
@ -382,6 +382,10 @@ void StmtPrinter::VisitDeclRefExpr(DeclRefExpr *Node) {
|
|||
OS << Node->getDecl()->getName();
|
||||
}
|
||||
|
||||
void StmtPrinter::VisitObjCIvarRefExpr(ObjCIvarRefExpr *Node) {
|
||||
OS << Node->getDecl()->getName();
|
||||
}
|
||||
|
||||
void StmtPrinter::VisitPreDefinedExpr(PreDefinedExpr *Node) {
|
||||
switch (Node->getIdentType()) {
|
||||
default:
|
||||
|
|
|
|||
|
|
@ -337,6 +337,20 @@ DeclRefExpr* DeclRefExpr::directMaterialize(Deserializer& D) {
|
|||
return dr;
|
||||
}
|
||||
|
||||
void ObjCIvarRefExpr::directEmit(Serializer& S) const {
|
||||
S.Emit(Loc);
|
||||
S.Emit(getType());
|
||||
S.EmitPtr(getDecl());
|
||||
}
|
||||
|
||||
ObjCIvarRefExpr* ObjCIvarRefExpr::directMaterialize(Deserializer& D) {
|
||||
SourceLocation Loc = SourceLocation::ReadVal(D);
|
||||
QualType T = QualType::ReadVal(D);
|
||||
ObjCIvarRefExpr* dr = new ObjCIvarRefExpr(NULL,T,Loc);
|
||||
D.ReadPtr(dr->D,false);
|
||||
return dr;
|
||||
}
|
||||
|
||||
DeclStmt* DeclStmt::directMaterialize(Deserializer& D) {
|
||||
ScopedDecl* decl = cast<ScopedDecl>(D.ReadOwnedPtr<Decl>());
|
||||
return new DeclStmt(decl);
|
||||
|
|
|
|||
|
|
@ -82,6 +82,12 @@ Sema::ExprResult Sema::ActOnIdentifierExpr(Scope *S, SourceLocation Loc,
|
|||
!getLangOptions().CPlusPlus)
|
||||
D = ImplicitlyDefineFunction(Loc, II, S);
|
||||
else {
|
||||
if (CurMethodDecl) {
|
||||
ObjcInterfaceDecl *IFace = CurMethodDecl->getClassInterface();
|
||||
ObjcInterfaceDecl *clsDeclared;
|
||||
if (ObjcIvarDecl *IV = IFace->lookupInstanceVariable(&II, clsDeclared))
|
||||
return new ObjCIvarRefExpr(IV, IV->getType(), Loc);
|
||||
}
|
||||
// If this name wasn't predeclared and if this is not a function call,
|
||||
// diagnose the problem.
|
||||
return Diag(Loc, diag::err_undeclared_var_use, II.getName());
|
||||
|
|
|
|||
|
|
@ -1229,7 +1229,32 @@ class ObjCProtocolExpr : public Expr {
|
|||
virtual child_iterator child_end();
|
||||
|
||||
};
|
||||
|
||||
/// ObjCIvarRefExpr - A reference to an ObjC instance variable.
|
||||
class ObjCIvarRefExpr : public Expr {
|
||||
class ObjcIvarDecl *D;
|
||||
SourceLocation Loc;
|
||||
public:
|
||||
ObjCIvarRefExpr(ObjcIvarDecl *d, QualType t, SourceLocation l) :
|
||||
Expr(ObjCIvarRefExprClass, t), D(d), Loc(l) {}
|
||||
|
||||
ObjcIvarDecl *getDecl() { return D; }
|
||||
const ObjcIvarDecl *getDecl() const { return D; }
|
||||
virtual SourceRange getSourceRange() const { return SourceRange(Loc); }
|
||||
|
||||
static bool classof(const Stmt *T) {
|
||||
return T->getStmtClass() == ObjCIvarRefExprClass;
|
||||
}
|
||||
static bool classof(const ObjCIvarRefExpr *) { return true; }
|
||||
|
||||
// Iterators
|
||||
virtual child_iterator child_begin();
|
||||
virtual child_iterator child_end();
|
||||
|
||||
virtual void directEmit(llvm::Serializer& S) const;
|
||||
static ObjCIvarRefExpr* directMaterialize(llvm::Deserializer& D);
|
||||
};
|
||||
|
||||
class ObjCMessageExpr : public Expr {
|
||||
enum { RECEIVER=0, ARGS_START=1 };
|
||||
|
||||
|
|
|
|||
|
|
@ -94,8 +94,9 @@ STMT(71, ObjCEncodeExpr , Expr)
|
|||
STMT(72, ObjCMessageExpr , Expr)
|
||||
STMT(73, ObjCSelectorExpr , Expr)
|
||||
STMT(74, ObjCProtocolExpr , Expr)
|
||||
STMT(75, ObjCIvarRefExpr , Expr)
|
||||
|
||||
LAST_EXPR(74)
|
||||
LAST_EXPR(75)
|
||||
|
||||
#undef STMT
|
||||
#undef FIRST_STMT
|
||||
|
|
|
|||
Loading…
Reference in New Issue