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) {
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 '}'
virtual StmtResult ActOnObjcAtFinallyStmt(SourceLocation AtLoc,
StmtTy *Body);
+ virtual StmtResult ActOnObjcAtTryStmt(SourceLocation AtLoc,
+ StmtTy *Try,
+ StmtTy *Catch, StmtTy *Finally);
+
//===--------------------------------------------------------------------===//
// Expression Parsing Callbacks: SemaExpr.cpp.
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;
+}
+
+
+
+
public:
ObjcAtTryStmt(SourceLocation atTryLoc, Stmt *atTryStmt,
- ObjcAtCatchStmt *atCatchStmt,
- ObjcAtFinallyStmt *atFinallyStmt)
+ Stmt *atCatchStmt,
+ Stmt *atFinallyStmt)
: Stmt(ObjcAtTryStmtClass), AtTryLoc(atTryLoc) {
SubStmts[TRY] = atTryStmt;
SubStmts[CATCH] = atCatchStmt;
return 0;
}
+ virtual StmtResult ActOnObjcAtTryStmt(SourceLocation AtLoc,
+ StmtTy *Try,
+ StmtTy *Catch, StmtTy *Finally) {
+ return 0;
+ }
//===--------------------------------------------------------------------===//
// Expression Parsing Callbacks.
//===--------------------------------------------------------------------===//