objc modern rewriter: allow translation of

multiple declaration of block variables
(with no initializer) on the same line.

llvm-svn: 155462
This commit is contained in:
Fariborz Jahanian 2012-04-24 18:16:20 +00:00
parent 810734b7f4
commit 32af25ea05
2 changed files with 28 additions and 3 deletions

View File

@ -337,7 +337,7 @@ namespace {
// Block specific rewrite rules.
void RewriteBlockPointerDecl(NamedDecl *VD);
void RewriteByRefVar(VarDecl *VD);
void RewriteByRefVar(VarDecl *VD, bool firstDecl);
Stmt *RewriteBlockDeclRefExpr(DeclRefExpr *VD);
Stmt *RewriteLocalVariableExternalStorage(DeclRefExpr *DRE);
void RewriteBlockPointerFunctionArgs(FunctionDecl *FD);
@ -4742,7 +4742,7 @@ std::string RewriteModernObjC::SynthesizeByrefCopyDestroyHelper(VarDecl *VD,
/// ND=initializer-if-any};
///
///
void RewriteModernObjC::RewriteByRefVar(VarDecl *ND) {
void RewriteModernObjC::RewriteByRefVar(VarDecl *ND, bool firstDecl) {
int flag = 0;
int isa = 0;
SourceLocation DeclLoc = ND->getTypeSpecStartLoc();
@ -4843,6 +4843,19 @@ void RewriteModernObjC::RewriteByRefVar(VarDecl *ND) {
// 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 {
@ -5309,7 +5322,7 @@ Stmt *RewriteModernObjC::RewriteFunctionBodyOrGlobalInitializer(Stmt *S) {
assert(!BlockByRefDeclNo.count(ND) &&
"RewriteFunctionBodyOrGlobalInitializer: Duplicate byref decl");
BlockByRefDeclNo[ND] = uniqueByrefDeclCount++;
RewriteByRefVar(VD);
RewriteByRefVar(VD, (DI == DS->decl_begin()));
}
else
RewriteTypeOfDecl(VD);

View File

@ -21,3 +21,15 @@ void y() {
int foo() {
__block int hello;
}
// rdar://7547630
// rewriting multiple __block decls on wintin same decl stmt.
int radar7547630() {
__block int BI1, BI2;
__block float FLOAT1, FT2, FFFFFFFF3,
FFFXXX4;
__block void (^B)(), (^BB)();
}