]> granicus.if.org Git - clang/commitdiff
RewriteObjC::RewriteObjCSynchronizedStmt(): Make sure the sync expr is cast to "id".
authorSteve Naroff <snaroff@apple.com>
Thu, 21 Aug 2008 13:03:03 +0000 (13:03 +0000)
committerSteve Naroff <snaroff@apple.com>
Thu, 21 Aug 2008 13:03:03 +0000 (13:03 +0000)
This fixes <rdar://problem/6163088> clang ObjC rewriter: @synchronized ([foo class]) {} does not cast properly.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@55118 91177308-0d34-0410-b5e6-96231b3b80d8

Driver/RewriteObjC.cpp

index 36e973d7236cb3895fbc74f96ff9cb2248ae11cf..2f91ea9741bc0cfd4fe6e1f5c29c6df418c06841 100644 (file)
@@ -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";