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

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

index f65e250faee7af54baf2e941ea51d706144df047..5d691a63ae5404fac419a4139461f08f73e30f4a 100644 (file)
@@ -1055,9 +1055,10 @@ Parser::StmtResult Parser::ParseObjCTryStmt(SourceLocation atLoc) {
     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
@@ -1080,12 +1081,13 @@ Parser::StmtResult Parser::ParseObjCTryStmt(SourceLocation atLoc) {
         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;
@@ -1093,6 +1095,10 @@ Parser::StmtResult Parser::ParseObjCTryStmt(SourceLocation atLoc) {
     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;
     }
index 83d82609317a45737e4e40112c1fe714c2d9b4ea..cdb6c1f63078ef5fe28d3ed45b05932afb2cb157 100644 (file)
@@ -343,6 +343,9 @@ public:
                                           SourceLocation RParen, StmtTy *Parm, 
                                           StmtTy *Body, StmtTy *CatchList);
   
+  virtual StmtResult ActOnObjcAtFinallyStmt(SourceLocation AtLoc, 
+                                            StmtTy *Body);
+  
   //===--------------------------------------------------------------------===//
   // Expression Parsing Callbacks: SemaExpr.cpp.
 
index 252a2422c86fe7f8712cc6d92e5418a6940b6d05..3bd6955a2faa0b19c149fc08feb04ba3126def7c 100644 (file)
@@ -659,3 +659,9 @@ Sema::ActOnObjcAtCatchStmt(SourceLocation AtLoc,
   return CatchList ? CatchList : CS;
 }
 
+Action::StmtResult
+Sema::ActOnObjcAtFinallyStmt(SourceLocation AtLoc, StmtTy *Body) {
+  ObjcAtFinallyStmt *FS = new ObjcAtFinallyStmt(AtLoc, 
+                                                static_cast<Stmt*>(Body));
+  return FS;
+}
index 1859df43e1ceaf4bb15f74464092bd9438ce2c09..b900c5833f200be04a9be6c881cd2b10f25a043e 100644 (file)
@@ -295,6 +295,11 @@ public:
     return 0;
   }
   
+  virtual StmtResult ActOnObjcAtFinallyStmt(SourceLocation AtLoc, 
+                                            StmtTy *Body) {
+    return 0;
+  }
+  
   //===--------------------------------------------------------------------===//
   // Expression Parsing Callbacks.
   //===--------------------------------------------------------------------===//