[cfe-commits] r155473 - in /cfe/trunk: lib/Rewrite/RewriteModernObjC.cpp test/Rewriter/rewrite-modern-block.mm
Fariborz Jahanian
fjahanian at apple.com
Tue Apr 24 12:38:45 PDT 2012
Author: fjahanian
Date: Tue Apr 24 14:38:45 2012
New Revision: 155473
URL: http://llvm.org/viewvc/llvm-project?rev=155473&view=rev
Log:
modern objc translator: Allow writing of multiple
declaration of __block variables on same lines
with initializers. // rdsr://7547630
Modified:
cfe/trunk/lib/Rewrite/RewriteModernObjC.cpp
cfe/trunk/test/Rewriter/rewrite-modern-block.mm
Modified: cfe/trunk/lib/Rewrite/RewriteModernObjC.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Rewrite/RewriteModernObjC.cpp?rev=155473&r1=155472&r2=155473&view=diff
==============================================================================
--- cfe/trunk/lib/Rewrite/RewriteModernObjC.cpp (original)
+++ cfe/trunk/lib/Rewrite/RewriteModernObjC.cpp Tue Apr 24 14:38:45 2012
@@ -337,7 +337,7 @@
// Block specific rewrite rules.
void RewriteBlockPointerDecl(NamedDecl *VD);
- void RewriteByRefVar(VarDecl *VD, bool firstDecl);
+ void RewriteByRefVar(VarDecl *VD, bool firstDecl, bool lastDecl);
Stmt *RewriteBlockDeclRefExpr(DeclRefExpr *VD);
Stmt *RewriteLocalVariableExternalStorage(DeclRefExpr *DRE);
void RewriteBlockPointerFunctionArgs(FunctionDecl *FD);
@@ -4742,7 +4742,8 @@
/// ND=initializer-if-any};
///
///
-void RewriteModernObjC::RewriteByRefVar(VarDecl *ND, bool firstDecl) {
+void RewriteModernObjC::RewriteByRefVar(VarDecl *ND, bool firstDecl,
+ bool lastDecl) {
int flag = 0;
int isa = 0;
SourceLocation DeclLoc = ND->getTypeSpecStartLoc();
@@ -4836,6 +4837,20 @@
ByrefType += utostr(flag);
}
+ if (!firstDecl) {
+ // In multiple __block declarations, and for all but 1st declaration,
+ // find location of the separating comma. This would be start location
+ // where new text is to be inserted.
+ DeclLoc = ND->getLocation();
+ const char *startDeclBuf = SM->getCharacterData(DeclLoc);
+ const char *commaBuf = startDeclBuf;
+ while (*commaBuf != ',')
+ commaBuf--;
+ assert((*commaBuf == ',') && "RewriteByRefVar: can't find ','");
+ DeclLoc = DeclLoc.getLocWithOffset(commaBuf - startDeclBuf);
+ startBuf = commaBuf;
+ }
+
if (!hasInit) {
ByrefType += "};\n";
unsigned nameSize = Name.size();
@@ -4843,19 +4858,6 @@
// part of the declaration.
if (Ty->isBlockPointerType() || Ty->isFunctionPointerType())
nameSize = 1;
- if (!firstDecl) {
- // In multiple __block declarations, and for all but 1st declaration,
- // find location of the separating comma. This would be start location
- // where new text is to be inserted.
- DeclLoc = ND->getLocation();
- const char *startDeclBuf = SM->getCharacterData(DeclLoc);
- const char *commaBuf = startDeclBuf;
- while (*commaBuf != ',')
- commaBuf--;
- assert((*commaBuf == ',') && "RewriteByRefVar: can't find ','");
- DeclLoc = DeclLoc.getLocWithOffset(commaBuf - startDeclBuf);
- startBuf = commaBuf;
- }
ReplaceText(DeclLoc, endBuf-startBuf+nameSize, ByrefType);
}
else {
@@ -4869,22 +4871,16 @@
startLoc = SM->getExpansionLoc(startLoc);
endBuf = SM->getCharacterData(startLoc);
ReplaceText(DeclLoc, endBuf-startBuf, ByrefType);
-
- // 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 *startInitializerBuf = SM->getCharacterData(startLoc);
- const char *semiBuf = strchr(startInitializerBuf, ';');
- assert((*semiBuf == ';') && "RewriteByRefVar: can't find ';'");
- SourceLocation semiLoc =
- startLoc.getLocWithOffset(semiBuf-startInitializerBuf);
- InsertText(semiLoc, "}");
+ const char separator = lastDecl ? ';' : ',';
+ const char *startInitializerBuf = SM->getCharacterData(startLoc);
+ const char *separatorBuf = strchr(startInitializerBuf, separator);
+ assert((*separatorBuf == separator) &&
+ "RewriteByRefVar: can't find ';' or ','");
+ SourceLocation separatorLoc =
+ startLoc.getLocWithOffset(separatorBuf-startInitializerBuf);
+
+ InsertText(separatorLoc, lastDecl ? "}" : "};\n");
}
return;
}
@@ -5322,7 +5318,7 @@
assert(!BlockByRefDeclNo.count(ND) &&
"RewriteFunctionBodyOrGlobalInitializer: Duplicate byref decl");
BlockByRefDeclNo[ND] = uniqueByrefDeclCount++;
- RewriteByRefVar(VD, (DI == DS->decl_begin()));
+ RewriteByRefVar(VD, (DI == DS->decl_begin()), ((DI+1) == DE));
}
else
RewriteTypeOfDecl(VD);
Modified: cfe/trunk/test/Rewriter/rewrite-modern-block.mm
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Rewriter/rewrite-modern-block.mm?rev=155473&r1=155472&r2=155473&view=diff
==============================================================================
--- cfe/trunk/test/Rewriter/rewrite-modern-block.mm (original)
+++ cfe/trunk/test/Rewriter/rewrite-modern-block.mm Tue Apr 24 14:38:45 2012
@@ -33,3 +33,13 @@
__block void (^B)(), (^BB)();
}
+// rewriting multiple __block decls on wintin same decl stmt
+// with initializers.
+void rdar7547630(const char *keybuf, const char *valuebuf) {
+ __block int BI1 = 1, BI2 = 2;
+
+ double __block BYREFVAR = 1.34, BYREFVAR_NO_INIT, BYREFVAR2 = 1.37;
+
+ __block const char *keys = keybuf, *values = valuebuf, *novalues;
+}
+
More information about the cfe-commits
mailing list