return true;
}
StmtResult CatchStmts;
+ StmtResult FinallyStmt;
StmtResult TryBody = ParseCompoundStatementBody();
while (Tok.is(tok::at)) {
- SourceLocation AtCatchLoc = ConsumeToken();
+ SourceLocation AtCatchFinallyLoc = ConsumeToken();
if (Tok.getIdentifierInfo()->getObjCKeywordID() == tok::objc_catch) {
StmtTy *FirstPart = 0;
ConsumeToken(); // consume catch
StmtResult CatchBody = ParseCompoundStatementBody();
if (CatchBody.isInvalid)
CatchBody = Actions.ActOnNullStmt(Tok.getLocation());
- CatchStmts = Actions.ActOnObjcAtCatchStmt(AtCatchLoc, RParenLoc,
+ CatchStmts = Actions.ActOnObjcAtCatchStmt(AtCatchFinallyLoc, RParenLoc,
FirstPart, CatchBody.Val, CatchStmts.Val);
ExitScope();
}
else {
- Diag(AtCatchLoc, diag::err_expected_lparen_after, "@catch clause");
+ Diag(AtCatchFinallyLoc, diag::err_expected_lparen_after,
+ "@catch clause");
return true;
}
catch_or_finally_seen = true;
else if (Tok.getIdentifierInfo()->getObjCKeywordID() == tok::objc_finally) {
ConsumeToken(); // consume finally
StmtResult FinallyBody = ParseCompoundStatementBody();
+ if (FinallyBody.isInvalid)
+ FinallyBody = Actions.ActOnNullStmt(Tok.getLocation());
+ FinallyStmt = Actions.ActOnObjcAtFinallyStmt(AtCatchFinallyLoc,
+ FinallyBody.Val);
catch_or_finally_seen = true;
break;
}
SourceLocation RParen, StmtTy *Parm,
StmtTy *Body, StmtTy *CatchList);
+ virtual StmtResult ActOnObjcAtFinallyStmt(SourceLocation AtLoc,
+ StmtTy *Body);
+
//===--------------------------------------------------------------------===//
// Expression Parsing Callbacks: SemaExpr.cpp.
return CatchList ? CatchList : CS;
}
+Action::StmtResult
+Sema::ActOnObjcAtFinallyStmt(SourceLocation AtLoc, StmtTy *Body) {
+ ObjcAtFinallyStmt *FS = new ObjcAtFinallyStmt(AtLoc,
+ static_cast<Stmt*>(Body));
+ return FS;
+}
return 0;
}
+ virtual StmtResult ActOnObjcAtFinallyStmt(SourceLocation AtLoc,
+ StmtTy *Body) {
+ return 0;
+ }
+
//===--------------------------------------------------------------------===//
// Expression Parsing Callbacks.
//===--------------------------------------------------------------------===//