From f859ef293c14f7b9e8f3c3761917660755eafb24 Mon Sep 17 00:00:00 2001 From: Fariborz Jahanian Date: Fri, 2 Nov 2007 15:39:31 +0000 Subject: [PATCH] AST for @try statement. llvm-svn: 43640 --- clang/Parse/ParseObjc.cpp | 9 +++++++-- clang/Sema/Sema.h | 4 ++++ clang/Sema/SemaStmt.cpp | 13 +++++++++++++ clang/include/clang/AST/Stmt.h | 4 ++-- clang/include/clang/Parse/Action.h | 5 +++++ 5 files changed, 31 insertions(+), 4 deletions(-) diff --git a/clang/Parse/ParseObjc.cpp b/clang/Parse/ParseObjc.cpp index 5d691a63ae54..bfc0a8c97347 100644 --- a/clang/Parse/ParseObjc.cpp +++ b/clang/Parse/ParseObjc.cpp @@ -1057,6 +1057,8 @@ Parser::StmtResult Parser::ParseObjCTryStmt(SourceLocation atLoc) { StmtResult CatchStmts; StmtResult FinallyStmt; StmtResult TryBody = ParseCompoundStatementBody(); + if (TryBody.isInvalid) + TryBody = Actions.ActOnNullStmt(Tok.getLocation()); while (Tok.is(tok::at)) { SourceLocation AtCatchFinallyLoc = ConsumeToken(); if (Tok.getIdentifierInfo()->getObjCKeywordID() == tok::objc_catch) { @@ -1103,9 +1105,12 @@ Parser::StmtResult Parser::ParseObjCTryStmt(SourceLocation atLoc) { break; } } - if (!catch_or_finally_seen) + if (!catch_or_finally_seen) { Diag(atLoc, diag::err_missing_catch_finally); - return true; + return true; + } + return Actions.ActOnObjcAtTryStmt(atLoc, TryBody.Val, CatchStmts.Val, + FinallyStmt.Val); } /// objc-method-def: objc-method-proto ';'[opt] '{' body '}' diff --git a/clang/Sema/Sema.h b/clang/Sema/Sema.h index cdb6c1f63078..3ab5516e896d 100644 --- a/clang/Sema/Sema.h +++ b/clang/Sema/Sema.h @@ -346,6 +346,10 @@ public: virtual StmtResult ActOnObjcAtFinallyStmt(SourceLocation AtLoc, StmtTy *Body); + virtual StmtResult ActOnObjcAtTryStmt(SourceLocation AtLoc, + StmtTy *Try, + StmtTy *Catch, StmtTy *Finally); + //===--------------------------------------------------------------------===// // Expression Parsing Callbacks: SemaExpr.cpp. diff --git a/clang/Sema/SemaStmt.cpp b/clang/Sema/SemaStmt.cpp index 3bd6955a2faa..b495bb828d0f 100644 --- a/clang/Sema/SemaStmt.cpp +++ b/clang/Sema/SemaStmt.cpp @@ -665,3 +665,16 @@ Sema::ActOnObjcAtFinallyStmt(SourceLocation AtLoc, StmtTy *Body) { static_cast(Body)); return FS; } + +Action::StmtResult +Sema::ActOnObjcAtTryStmt(SourceLocation AtLoc, + StmtTy *Try, StmtTy *Catch, StmtTy *Finally) { + ObjcAtTryStmt *TS = new ObjcAtTryStmt(AtLoc, static_cast(Try), + static_cast(Catch), + static_cast(Finally)); + return TS; +} + + + + diff --git a/clang/include/clang/AST/Stmt.h b/clang/include/clang/AST/Stmt.h index 2f2a14c010ec..262b5db8c3d5 100644 --- a/clang/include/clang/AST/Stmt.h +++ b/clang/include/clang/AST/Stmt.h @@ -736,8 +736,8 @@ private: public: ObjcAtTryStmt(SourceLocation atTryLoc, Stmt *atTryStmt, - ObjcAtCatchStmt *atCatchStmt, - ObjcAtFinallyStmt *atFinallyStmt) + Stmt *atCatchStmt, + Stmt *atFinallyStmt) : Stmt(ObjcAtTryStmtClass), AtTryLoc(atTryLoc) { SubStmts[TRY] = atTryStmt; SubStmts[CATCH] = atCatchStmt; diff --git a/clang/include/clang/Parse/Action.h b/clang/include/clang/Parse/Action.h index b900c5833f20..f7f58a80cd8d 100644 --- a/clang/include/clang/Parse/Action.h +++ b/clang/include/clang/Parse/Action.h @@ -300,6 +300,11 @@ public: return 0; } + virtual StmtResult ActOnObjcAtTryStmt(SourceLocation AtLoc, + StmtTy *Try, + StmtTy *Catch, StmtTy *Finally) { + return 0; + } //===--------------------------------------------------------------------===// // Expression Parsing Callbacks. //===--------------------------------------------------------------------===//