From: Steve Naroff Date: Wed, 23 Dec 2009 17:24:33 +0000 (+0000) Subject: Add support for handling initializers in RewriteObjC::RewriteByRefVar(). X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=c5143c538783a2834cfdc3d29db0ff76e857818f;p=clang Add support for handling initializers in RewriteObjC::RewriteByRefVar(). 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 --- diff --git a/lib/Frontend/RewriteObjC.cpp b/lib/Frontend/RewriteObjC.cpp index 70eb999c58..656d61b133 100644 --- a/lib/Frontend/RewriteObjC.cpp +++ b/lib/Frontend/RewriteObjC.cpp @@ -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; }