AST for @synchronized.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@46524 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/AST/Stmt.cpp b/AST/Stmt.cpp
index 8d4f613..0f4936b 100644
--- a/AST/Stmt.cpp
+++ b/AST/Stmt.cpp
@@ -249,3 +249,13 @@
Stmt::child_iterator ObjCAtThrowStmt::child_end() {
return &Throw+1;
}
+
+// ObjCAtSynchronizedStmt
+Stmt::child_iterator ObjCAtSynchronizedStmt::child_begin() {
+ return &SynchBody;
+}
+
+Stmt::child_iterator ObjCAtSynchronizedStmt::child_end() {
+ return &SynchBody+1;
+}
+
diff --git a/AST/StmtSerialization.cpp b/AST/StmtSerialization.cpp
index 545813c..8394dc6 100644
--- a/AST/StmtSerialization.cpp
+++ b/AST/StmtSerialization.cpp
@@ -893,6 +893,20 @@
Stmt* Throw = D.ReadOwnedPtr<Stmt>();
return new ObjCAtThrowStmt(L,Throw);
}
+
+void ObjCAtSynchronizedStmt::EmitImpl(Serializer& S) const {
+ S.Emit(AtSynchronizedLoc);
+ S.EmitOwnedPtr(SynchExpr);
+ S.EmitOwnedPtr(SynchBody);
+}
+
+ObjCAtSynchronizedStmt* ObjCAtSynchronizedStmt::CreateImpl(Deserializer& D) {
+ SourceLocation L = SourceLocation::ReadVal(D);
+ Expr *syncExpr = D.ReadOwnedPtr<Expr>();
+ Stmt *synchBody = D.ReadOwnedPtr<Stmt>();
+ ObjCAtSynchronizedStmt* stmt = new ObjCAtSynchronizedStmt(L,syncExpr,synchBody);
+ return stmt;
+}
void ObjCAtTryStmt::EmitImpl(Serializer& S) const {
S.Emit(AtTryLoc);
diff --git a/Parse/ParseObjc.cpp b/Parse/ParseObjc.cpp
index 87e5c18..41cab3b 100644
--- a/Parse/ParseObjc.cpp
+++ b/Parse/ParseObjc.cpp
@@ -1113,7 +1113,27 @@
/// @synchronized '(' expression ')'
///
Parser::StmtResult Parser::ParseObjCSynchronizedStmt(SourceLocation atLoc) {
- return 0;
+ ExprResult Res;
+ ConsumeToken(); // consume synchronized
+ if (Tok.isNot(tok::l_paren)) {
+ Diag (Tok, diag::err_expected_lparen_after, "@synchronized");
+ return true;
+ }
+ ConsumeParen(); // '('
+ Res = ParseExpression();
+ if (Res.isInvalid) {
+ SkipUntil(tok::semi);
+ return true;
+ }
+ if (Tok.isNot(tok::r_paren)) {
+ Diag (Tok, diag::err_expected_rparen);
+ return true;
+ }
+ ConsumeParen(); // ')'
+ StmtResult SynchBody = ParseCompoundStatementBody();
+ if (SynchBody.isInvalid)
+ SynchBody = Actions.ActOnNullStmt(Tok.getLocation());
+ return Actions.ActOnObjCAtSynchronizedStmt(atLoc, Res.Val, SynchBody.Val);
}
/// objc-try-catch-statement:
diff --git a/Sema/Sema.h b/Sema/Sema.h
index c402bae..a35af43 100644
--- a/Sema/Sema.h
+++ b/Sema/Sema.h
@@ -378,6 +378,9 @@
virtual StmtResult ActOnObjCAtThrowStmt(SourceLocation AtLoc,
StmtTy *Throw);
+ virtual StmtResult ActOnObjCAtSynchronizedStmt(SourceLocation AtLoc,
+ ExprTy *SynchExpr,
+ StmtTy *SynchBody);
//===--------------------------------------------------------------------===//
// Expression Parsing Callbacks: SemaExpr.cpp.
diff --git a/Sema/SemaStmt.cpp b/Sema/SemaStmt.cpp
index b848386..e702ce8 100644
--- a/Sema/SemaStmt.cpp
+++ b/Sema/SemaStmt.cpp
@@ -809,5 +809,12 @@
return TS;
}
+Action::StmtResult
+Sema::ActOnObjCAtSynchronizedStmt(SourceLocation AtLoc, ExprTy *SynchExpr,
+ StmtTy *SynchBody) {
+ ObjCAtSynchronizedStmt *SS = new ObjCAtSynchronizedStmt(AtLoc,
+ static_cast<Expr*>(SynchExpr), static_cast<Stmt*>(SynchBody));
+ return SS;
+}
diff --git a/include/clang/AST/Stmt.h b/include/clang/AST/Stmt.h
index 94ae9c8..17757fb 100644
--- a/include/clang/AST/Stmt.h
+++ b/include/clang/AST/Stmt.h
@@ -992,6 +992,9 @@
}
static bool classof(const ObjCAtSynchronizedStmt *) { return true; }
+ virtual child_iterator child_begin();
+ virtual child_iterator child_end();
+
virtual void EmitImpl(llvm::Serializer& S) const;
static ObjCAtSynchronizedStmt* CreateImpl(llvm::Deserializer& D);
};
diff --git a/include/clang/Parse/Action.h b/include/clang/Parse/Action.h
index d948b94..ce4781b 100644
--- a/include/clang/Parse/Action.h
+++ b/include/clang/Parse/Action.h
@@ -335,6 +335,12 @@
return 0;
}
+ virtual StmtResult ActOnObjCAtSynchronizedStmt(SourceLocation AtLoc,
+ ExprTy *SynchExpr,
+ StmtTy *SynchBody) {
+ return 0;
+ }
+
//===--------------------------------------------------------------------===//
// Expression Parsing Callbacks.
//===--------------------------------------------------------------------===//