forked from OSchip/llvm-project
parent
04059dd351
commit
f859ef293c
|
@ -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 '}'
|
||||
|
|
|
@ -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.
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -300,6 +300,11 @@ public:
|
|||
return 0;
|
||||
}
|
||||
|
||||
virtual StmtResult ActOnObjcAtTryStmt(SourceLocation AtLoc,
|
||||
StmtTy *Try,
|
||||
StmtTy *Catch, StmtTy *Finally) {
|
||||
return 0;
|
||||
}
|
||||
//===--------------------------------------------------------------------===//
|
||||
// Expression Parsing Callbacks.
|
||||
//===--------------------------------------------------------------------===//
|
||||
|
|
Loading…
Reference in New Issue