diff options
Diffstat (limited to 'clang/lib')
| -rw-r--r-- | clang/lib/AST/Expr.cpp | 6 | ||||
| -rw-r--r-- | clang/lib/AST/StmtPrinter.cpp | 4 | ||||
| -rw-r--r-- | clang/lib/AST/StmtSerialization.cpp | 11 | ||||
| -rw-r--r-- | clang/lib/Sema/SemaExpr.cpp | 5 |
4 files changed, 25 insertions, 1 deletions
diff --git a/clang/lib/AST/Expr.cpp b/clang/lib/AST/Expr.cpp index 6b0eb048b92..357d711978b 100644 --- a/clang/lib/AST/Expr.cpp +++ b/clang/lib/AST/Expr.cpp @@ -1189,7 +1189,7 @@ Stmt::child_iterator ObjCIvarRefExpr::child_end() { return reinterpret_cast<Stmt**>(&Base)+1; } -// ObjCIvarRefExpr +// ObjCPropertyRefExpr Stmt::child_iterator ObjCPropertyRefExpr::child_begin() { return reinterpret_cast<Stmt**>(&Base); } @@ -1198,6 +1198,10 @@ Stmt::child_iterator ObjCPropertyRefExpr::child_end() { return reinterpret_cast<Stmt**>(&Base)+1; } +// ObjCSuperRefExpr +Stmt::child_iterator ObjCSuperRefExpr::child_begin() { return child_iterator();} +Stmt::child_iterator ObjCSuperRefExpr::child_end() { return child_iterator(); } + // PreDefinedExpr Stmt::child_iterator PreDefinedExpr::child_begin() { return child_iterator(); } Stmt::child_iterator PreDefinedExpr::child_end() { return child_iterator(); } diff --git a/clang/lib/AST/StmtPrinter.cpp b/clang/lib/AST/StmtPrinter.cpp index d52f48ed210..a740facf76f 100644 --- a/clang/lib/AST/StmtPrinter.cpp +++ b/clang/lib/AST/StmtPrinter.cpp @@ -476,6 +476,10 @@ void StmtPrinter::VisitDeclRefExpr(DeclRefExpr *Node) { OS << Node->getDecl()->getName(); } +void StmtPrinter::VisitObjCSuperRefExpr(ObjCSuperRefExpr *Node) { + OS << "super"; +} + void StmtPrinter::VisitObjCIvarRefExpr(ObjCIvarRefExpr *Node) { if (Node->getBase()) { PrintExpr(Node->getBase()); diff --git a/clang/lib/AST/StmtSerialization.cpp b/clang/lib/AST/StmtSerialization.cpp index 25e9514db18..99a890946de 100644 --- a/clang/lib/AST/StmtSerialization.cpp +++ b/clang/lib/AST/StmtSerialization.cpp @@ -518,6 +518,17 @@ DeclRefExpr* DeclRefExpr::CreateImpl(Deserializer& D, ASTContext& C) { return new DeclRefExpr(decl,T,Loc); } +void ObjCSuperRefExpr::EmitImpl(Serializer& S) const { + S.Emit(Loc); + S.Emit(getType()); +} + +ObjCSuperRefExpr* ObjCSuperRefExpr::CreateImpl(Deserializer& D, ASTContext& C) { + SourceLocation Loc = SourceLocation::ReadVal(D); + QualType T = QualType::ReadVal(D); + return new ObjCSuperRefExpr(T, Loc); +} + DeclStmt* DeclStmt::CreateImpl(Deserializer& D, ASTContext& C) { ScopedDecl* decl = cast<ScopedDecl>(D.ReadOwnedPtr<Decl>(C)); SourceLocation StartLoc = SourceLocation::ReadVal(D); diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index f75c3924a00..626e829044a 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -99,6 +99,11 @@ Sema::ExprResult Sema::ActOnIdentifierExpr(Scope *S, SourceLocation Loc, static_cast<Expr*>(SelfExpr.Val), true, true); } } + if (!strncmp(II.getName(), "super", 5)) { + QualType T = Context.getPointerType(Context.getObjCInterfaceType( + CurMethodDecl->getClassInterface())); + return new ObjCSuperRefExpr(T, Loc); + } } if (D == 0) { |

