From: Fariborz Jahanian Date: Wed, 30 Jan 2008 17:38:29 +0000 (+0000) Subject: Fixed misc. issues raised by Chris L. on @synchronized implementation. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=78a677bbb5fa115fa0995b5783adeeefad67167e;p=clang Fixed misc. issues raised by Chris L. on @synchronized implementation. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@46558 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/AST/StmtPrinter.cpp b/AST/StmtPrinter.cpp index 2bdeadfbef..f04f9e5ba5 100644 --- a/AST/StmtPrinter.cpp +++ b/AST/StmtPrinter.cpp @@ -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(Node->getSynchBody())) - { - PrintRawCompoundStmt(CS); - OS << "\n"; - } + PrintRawCompoundStmt(Node->getSynchBody()); + OS << "\n"; } //===----------------------------------------------------------------------===// diff --git a/Parse/ParseObjc.cpp b/Parse/ParseObjc.cpp index 41cab3bf77..4f7afb7f73 100644 --- a/Parse/ParseObjc.cpp +++ b/Parse/ParseObjc.cpp @@ -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()); diff --git a/include/clang/AST/Stmt.h b/include/clang/AST/Stmt.h index 5990ca20c7..9fbd1aa022 100644 --- a/include/clang/AST/Stmt.h +++ b/include/clang/AST/Stmt.h @@ -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(SubStmts[SYNC_BODY]); + } + CompoundStmt *getSynchBody() { + return reinterpret_cast(SubStmts[SYNC_BODY]); + } const Expr *getSynchExpr() const { return reinterpret_cast(SubStmts[SYNC_EXPR]);