]> granicus.if.org Git - clang/commitdiff
AST for @try statement.
authorFariborz Jahanian <fjahanian@apple.com>
Fri, 2 Nov 2007 15:39:31 +0000 (15:39 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Fri, 2 Nov 2007 15:39:31 +0000 (15:39 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@43640 91177308-0d34-0410-b5e6-96231b3b80d8

Parse/ParseObjc.cpp
Sema/Sema.h
Sema/SemaStmt.cpp
include/clang/AST/Stmt.h
include/clang/Parse/Action.h

index 5d691a63ae5404fac419a4139461f08f73e30f4a..bfc0a8c9734743d6a16f04695fba53a291b21744 100644 (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 '}'
index cdb6c1f63078ef5fe28d3ed45b05932afb2cb157..3ab5516e896d9e281bc4e2aa78262f0422b67d17 100644 (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.
 
index 3bd6955a2faa0b19c149fc08feb04ba3126def7c..b495bb828d0fefb0458cc225c046270e9b34257a 100644 (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;
+}
+
+
+
+
index 2f2a14c010ecb3a6a488064a83a4abd60c282f27..262b5db8c3d5b58a6c4ee7859fe9ff0d5de873e3 100644 (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;
index b900c5833f200be04a9be6c881cd2b10f25a043e..f7f58a80cd8d4b052d3444f84bb21d15bbc76928 100644 (file)
@@ -300,6 +300,11 @@ public:
     return 0;
   }
   
+  virtual StmtResult ActOnObjcAtTryStmt(SourceLocation AtLoc, 
+                                        StmtTy *Try, 
+                                        StmtTy *Catch, StmtTy *Finally) {
+    return 0;
+  }
   //===--------------------------------------------------------------------===//
   // Expression Parsing Callbacks.
   //===--------------------------------------------------------------------===//