AST for @try statement.

llvm-svn: 43640
This commit is contained in:
Fariborz Jahanian 2007-11-02 15:39:31 +00:00
parent 04059dd351
commit f859ef293c
5 changed files with 31 additions and 4 deletions

View File

@ -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 '}'

View File

@ -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.

View File

@ -665,3 +665,16 @@ Sema::ActOnObjcAtFinallyStmt(SourceLocation AtLoc, StmtTy *Body) {
static_cast<Stmt*>(Body));
return FS;
}
Action::StmtResult
Sema::ActOnObjcAtTryStmt(SourceLocation AtLoc,
StmtTy *Try, StmtTy *Catch, StmtTy *Finally) {
ObjcAtTryStmt *TS = new ObjcAtTryStmt(AtLoc, static_cast<Stmt*>(Try),
static_cast<Stmt*>(Catch),
static_cast<Stmt*>(Finally));
return TS;
}

View File

@ -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;

View File

@ -300,6 +300,11 @@ public:
return 0;
}
virtual StmtResult ActOnObjcAtTryStmt(SourceLocation AtLoc,
StmtTy *Try,
StmtTy *Catch, StmtTy *Finally) {
return 0;
}
//===--------------------------------------------------------------------===//
// Expression Parsing Callbacks.
//===--------------------------------------------------------------------===//