diff options
author | Chris Lattner <sabre@nondot.org> | 2009-04-21 06:11:25 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2009-04-21 06:11:25 +0000 |
commit | a868a203a18571d091e5d226f5f100d4440f3d94 (patch) | |
tree | c1e1f24e322e06d42e9d34f425b6c23e12dd53b2 /lib/Sema/SemaStmt.cpp | |
parent | 32b325fb33d4bd7a5324c73f338144390362da39 (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.cpp | 9 |
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()))); |