]> granicus.if.org Git - clang/commitdiff
Fixed misc. issues raised by Chris L. on @synchronized implementation.
authorFariborz Jahanian <fjahanian@apple.com>
Wed, 30 Jan 2008 17:38:29 +0000 (17:38 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Wed, 30 Jan 2008 17:38:29 +0000 (17:38 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@46558 91177308-0d34-0410-b5e6-96231b3b80d8

AST/StmtPrinter.cpp
Parse/ParseObjc.cpp
include/clang/AST/Stmt.h

index 2bdeadfbef11d75d804cec476ff445dc176be3c8..f04f9e5ba517896b36eaeb964cdcd22266cb04fd 100644 (file)
@@ -446,7 +446,7 @@ void StmtPrinter::VisitObjCAtCatchStmt (ObjCAtCatchStmt *Node) {
   Indent() << "@catch (...) { /* todo */ } \n";
 }
 
-void StmtPrinter::VisitObjCAtThrowStmt (ObjCAtThrowStmt *Node) {
+void StmtPrinter::VisitObjCAtThrowStmt(ObjCAtThrowStmt *Node) {
   Indent() << "@throw";
   if (Node->getThrowExpr()) {
     OS << " ";
@@ -455,15 +455,12 @@ void StmtPrinter::VisitObjCAtThrowStmt (ObjCAtThrowStmt *Node) {
   OS << ";\n";
 }
 
-void StmtPrinter::VisitObjCAtSynchronizedStmt (ObjCAtSynchronizedStmt *Node) {
+void StmtPrinter::VisitObjCAtSynchronizedStmt(ObjCAtSynchronizedStmt *Node) {
   Indent() << "@synchronized (";
   PrintExpr(Node->getSynchExpr());
   OS << ")";
-  if (CompoundStmt *CS = dyn_cast<CompoundStmt>(Node->getSynchBody()))
-    {
-      PrintRawCompoundStmt(CS);
-      OS << "\n";
-    }
+  PrintRawCompoundStmt(Node->getSynchBody());
+  OS << "\n";
 }
 
 //===----------------------------------------------------------------------===//
index 41cab3bf77914c0aef992c9262857b435beff9c5..4f7afb7f736928078eaadae3253ae19cfeb5b729 100644 (file)
@@ -1110,26 +1110,29 @@ Parser::StmtResult Parser::ParseObjCThrowStmt(SourceLocation atLoc) {
 }
 
 /// objc-synchronized-statement:
-///   @synchronized '(' expression ')'
+///   @synchronized '(' expression ')' compound-statement
 ///
 Parser::StmtResult Parser::ParseObjCSynchronizedStmt(SourceLocation atLoc) {
-  ExprResult Res;
   ConsumeToken(); // consume synchronized
   if (Tok.isNot(tok::l_paren)) {
     Diag (Tok, diag::err_expected_lparen_after, "@synchronized");
     return true;
   }
   ConsumeParen();  // '('
-  Res = ParseExpression();
+  ExprResult Res = ParseExpression();
   if (Res.isInvalid) {
     SkipUntil(tok::semi);
     return true;
   }
   if (Tok.isNot(tok::r_paren)) {
-    Diag (Tok, diag::err_expected_rparen);
+    Diag (Tok, diag::err_expected_lbrace);
     return true;
   }
   ConsumeParen();  // ')'
+  if (Tok.isNot(tok::l_brace)) {
+    Diag (Tok, diag::err_expected_lbrace);
+    return true;
+  }
   StmtResult SynchBody = ParseCompoundStatementBody();
   if (SynchBody.isInvalid)
     SynchBody = Actions.ActOnNullStmt(Tok.getLocation());
index 5990ca20c7f878303170fb583737eaa8cbce6514..9fbd1aa0226583b52141a519065f4677a65a8c0a 100644 (file)
@@ -934,6 +934,9 @@ public:
 };
 
 /// ObjCAtSynchronizedStmt - This is for objective-c's @synchronized statement.
+/// Example: @synchronized (sem) {
+///             do-somthing;
+///          }
 ///
 class ObjCAtSynchronizedStmt : public Stmt {
 private:
@@ -950,8 +953,12 @@ public:
       AtSynchronizedLoc = atSynchronizedLoc;
     }
   
-  const Stmt *getSynchBody() const { return SubStmts[SYNC_BODY]; }
-  Stmt *getSynchBody() { return SubStmts[SYNC_BODY]; }
+  const CompoundStmt *getSynchBody() const {
+    return reinterpret_cast<CompoundStmt*>(SubStmts[SYNC_BODY]);
+  }
+  CompoundStmt *getSynchBody() { 
+    return reinterpret_cast<CompoundStmt*>(SubStmts[SYNC_BODY]); 
+  }
   
   const Expr *getSynchExpr() const { 
     return reinterpret_cast<Expr*>(SubStmts[SYNC_EXPR]);