summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSteve Naroff <snaroff@apple.com>2008-08-21 13:03:03 +0000
committerSteve Naroff <snaroff@apple.com>2008-08-21 13:03:03 +0000
commitb2fc05227c376f2efb833dcb132fc8a1f7a03855 (patch)
tree6cbfe8a07d7014c49cf7ed5b18551c5b1ae1e6bc
parent75eeeb399e587bc845035fc9ef13568adb688d82 (diff)
downloadbcm5719-llvm-b2fc05227c376f2efb833dcb132fc8a1f7a03855.tar.gz
bcm5719-llvm-b2fc05227c376f2efb833dcb132fc8a1f7a03855.zip
RewriteObjC::RewriteObjCSynchronizedStmt(): Make sure the sync expr is cast to "id".
This fixes <rdar://problem/6163088> clang ObjC rewriter: @synchronized ([foo class]) {} does not cast properly. llvm-svn: 55118
-rw-r--r--clang/Driver/RewriteObjC.cpp10
1 files changed, 7 insertions, 3 deletions
diff --git a/clang/Driver/RewriteObjC.cpp b/clang/Driver/RewriteObjC.cpp
index 36e973d7236..2f91ea9741b 100644
--- a/clang/Driver/RewriteObjC.cpp
+++ b/clang/Driver/RewriteObjC.cpp
@@ -1302,8 +1302,10 @@ Stmt *RewriteObjC::RewriteObjCSynchronizedStmt(ObjCAtSynchronizedStmt *S) {
assert((*startBuf == '@') && "bogus @synchronized location");
std::string buf;
- buf = "objc_sync_enter";
- ReplaceText(startLoc, 13, buf.c_str(), buf.size());
+ buf = "objc_sync_enter((id)";
+ const char *lparenBuf = startBuf;
+ while (*lparenBuf != '(') lparenBuf++;
+ ReplaceText(startLoc, lparenBuf-startBuf+1, buf.c_str(), buf.size());
// We can't use S->getSynchExpr()->getLocEnd() to find the end location, since
// the sync expression is typically a message expression that's already
// been rewritten! (which implies the SourceLocation's are invalid).
@@ -1329,8 +1331,10 @@ Stmt *RewriteObjC::RewriteObjCSynchronizedStmt(ObjCAtSynchronizedStmt *S) {
buf += " _rethrow = objc_exception_extract(&_stack);\n";
buf += " if (!_rethrow) objc_exception_try_exit(&_stack);\n";
buf += " objc_sync_exit(";
+ Expr *syncExpr = new ExplicitCastExpr(Context->getObjCIdType(),
+ S->getSynchExpr(), SourceLocation());
std::ostringstream syncExprBuf;
- S->getSynchExpr()->printPretty(syncExprBuf);
+ syncExpr->printPretty(syncExprBuf);
buf += syncExprBuf.str();
buf += ");\n";
buf += " if (_rethrow) objc_exception_throw(_rethrow);\n";
OpenPOWER on IntegriCloud