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 | 3501d43a109c16cca3714af76aff29744776a65b (patch) | |
tree | 458b29aa4a3d77a319605a540f166d6d950d3be9 /clang/lib | |
parent | 6af6edb8b71e3db4178da569d93bb7e5bb2aa903 (diff) | |
download | bcm5719-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.cpp | 9 |
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()))); |