From bd49a647afd9cc534fef13cadf652d4e9c396e2b 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. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@43640 91177308-0d34-0410-b5e6-96231b3b80d8 --- Parse/ParseObjc.cpp | 9 +++++++-- Sema/Sema.h | 4 ++++ Sema/SemaStmt.cpp | 13 +++++++++++++ include/clang/AST/Stmt.h | 4 ++-- include/clang/Parse/Action.h | 5 +++++ 5 files changed, 31 insertions(+), 4 deletions(-) diff --git a/Parse/ParseObjc.cpp b/Parse/ParseObjc.cpp index 5d691a63ae..bfc0a8c973 100644 --- a/Parse/ParseObjc.cpp +++ b/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/Sema/Sema.h b/Sema/Sema.h index cdb6c1f630..3ab5516e89 100644 --- a/Sema/Sema.h +++ b/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/Sema/SemaStmt.cpp b/Sema/SemaStmt.cpp index 3bd6955a2f..b495bb828d 100644 --- a/Sema/SemaStmt.cpp +++ b/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/include/clang/AST/Stmt.h b/include/clang/AST/Stmt.h index 2f2a14c010..262b5db8c3 100644 --- a/include/clang/AST/Stmt.h +++ b/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/include/clang/Parse/Action.h b/include/clang/Parse/Action.h index b900c5833f..f7f58a80cd 100644 --- a/include/clang/Parse/Action.h +++ b/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. //===--------------------------------------------------------------------===// -- 2.50.1