aboutsummaryrefslogtreecommitdiff
path: root/lib/Sema/SemaStmt.cpp
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
commita868a203a18571d091e5d226f5f100d4440f3d94 (patch)
treec1e1f24e322e06d42e9d34f425b6c23e12dd53b2 /lib/Sema/SemaStmt.cpp
parent32b325fb33d4bd7a5324c73f338144390362da39 (diff)
implement semantic analysis for @synchronized, fixing a crash on invalid
rdar://6810940 - @synchronized has no sema checks git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@69670 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Sema/SemaStmt.cpp')
-rw-r--r--lib/Sema/SemaStmt.cpp9
1 files changed, 9 insertions, 0 deletions
diff --git a/lib/Sema/SemaStmt.cpp b/lib/Sema/SemaStmt.cpp
index 26cba5bec7..fb8a8ece43 100644
--- a/lib/Sema/SemaStmt.cpp
+++ b/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())));