aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFariborz Jahanian <fjahanian@apple.com>2007-11-02 15:39:31 +0000
committerFariborz Jahanian <fjahanian@apple.com>2007-11-02 15:39:31 +0000
commitbd49a647afd9cc534fef13cadf652d4e9c396e2b (patch)
tree6701065bd7a785cde464fabd505ee3d78caa4640
parent524233cc26da4e7be9a6eca1f2ad82df78cdaa93 (diff)
AST for @try statement.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@43640 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--Parse/ParseObjc.cpp9
-rw-r--r--Sema/Sema.h4
-rw-r--r--Sema/SemaStmt.cpp13
-rw-r--r--include/clang/AST/Stmt.h4
-rw-r--r--include/clang/Parse/Action.h5
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<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;
+}
+
+
+
+
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.
//===--------------------------------------------------------------------===//