summaryrefslogtreecommitdiffstats
path: root/clang/lib
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2009-04-21 06:11:25 +0000
committerChris Lattner <sabre@nondot.org>2009-04-21 06:11:25 +0000
commit3501d43a109c16cca3714af76aff29744776a65b (patch)
tree458b29aa4a3d77a319605a540f166d6d950d3be9 /clang/lib
parent6af6edb8b71e3db4178da569d93bb7e5bb2aa903 (diff)
downloadbcm5719-llvm-3501d43a109c16cca3714af76aff29744776a65b.tar.gz
bcm5719-llvm-3501d43a109c16cca3714af76aff29744776a65b.zip
implement semantic analysis for @synchronized, fixing a crash on invalid
rdar://6810940 - @synchronized has no sema checks llvm-svn: 69670
Diffstat (limited to 'clang/lib')
-rw-r--r--clang/lib/Sema/SemaStmt.cpp9
1 files changed, 9 insertions, 0 deletions
diff --git a/clang/lib/Sema/SemaStmt.cpp b/clang/lib/Sema/SemaStmt.cpp
index 26cba5bec74..fb8a8ece437 100644
--- a/clang/lib/Sema/SemaStmt.cpp
+++ b/clang/lib/Sema/SemaStmt.cpp
@@ -1092,6 +1092,15 @@ Sema::ActOnObjCAtSynchronizedStmt(SourceLocation AtLoc, ExprArg SynchExpr,
StmtArg SynchBody) {
CurFunctionNeedsScopeChecking = true;
+ // Make sure the expression type is an ObjC pointer or "void *".
+ Expr *SyncExpr = static_cast<Expr*>(SynchExpr.get());
+ if (!Context.isObjCObjectPointerType(SyncExpr->getType())) {
+ const PointerType *PT = SyncExpr->getType()->getAsPointerType();
+ if (!PT || !PT->getPointeeType()->isVoidType())
+ return StmtError(Diag(AtLoc, diag::error_objc_synchronized_expects_object)
+ << SyncExpr->getType() << SyncExpr->getSourceRange());
+ }
+
return Owned(new (Context) ObjCAtSynchronizedStmt(AtLoc,
static_cast<Stmt*>(SynchExpr.release()),
static_cast<Stmt*>(SynchBody.release())));
OpenPOWER on IntegriCloud