]> granicus.if.org Git - clang/commitdiff
Add support for handling initializers in RewriteObjC::RewriteByRefVar().
authorSteve Naroff <snaroff@apple.com>
Wed, 23 Dec 2009 17:24:33 +0000 (17:24 +0000)
committerSteve Naroff <snaroff@apple.com>
Wed, 23 Dec 2009 17:24:33 +0000 (17:24 +0000)
As the FIXME indicates, RewriteByRefVar() won't work for multiple declarators (in general). I've discussed this with Fariborz and he is aware of the limitation.

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

lib/Frontend/RewriteObjC.cpp

index 70eb999c58c4af79a401835b6e4edf9687232349..656d61b133df0a74bfcfbe6982c9d9044511a63e 100644 (file)
@@ -4392,11 +4392,22 @@ void RewriteObjC::RewriteByRefVar(VarDecl *ND) {
     ByrefType += "0, ";
     ByrefType += "sizeof(struct __Block_byref_" + Name + "), ";
     InsertText(startLoc, ByrefType.c_str(), ByrefType.size());
-#if 0
-    ByrefType = "};\n";
-    SourceLocation endLoc = ND->getInit()->getLocEnd();
-    InsertText(startLoc, ByrefType.c_str(), ByrefType.size());
-#endif
+    
+    // Complete the newly synthesized compound expression by inserting a right
+    // curly brace before the end of the declaration.
+    // FIXME: This approach avoids rewriting the initializer expression. It
+    // also assumes there is only one declarator. For example, the following
+    // isn't currently supported by this routine (in general):
+    // 
+    // double __block BYREFVAR = 1.34, BYREFVAR2 = 1.37;
+    //
+    const char *startBuf = SM->getCharacterData(startLoc);
+    const char *semiBuf = strchr(startBuf, ';');
+    assert((*semiBuf == ';') && "RewriteByRefVar: can't find ';'");
+    SourceLocation semiLoc =
+      startLoc.getFileLocWithOffset(semiBuf-startBuf);
+
+    InsertText(semiLoc, "}", 1);
   }
   return;
 }