Skip to content

Commit

Permalink
objective-c rewrite: Fixes rewriting of objective-c collection
Browse files Browse the repository at this point in the history
statement inside a block. // rdar://9878420


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@136717 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
Fariborz Jahanian committed Aug 2, 2011
1 parent 4068eaa commit f23a0ff
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 1 deletion.
10 changes: 9 additions & 1 deletion lib/Rewrite/RewriteObjC.cpp
Expand Up @@ -5577,12 +5577,20 @@ Stmt *RewriteObjC::RewriteFunctionBodyOrGlobalInitializer(Stmt *S) {
CurrentBody = BE->getBody();
CollectPropertySetters(CurrentBody);
PropParentMap = 0;
// block literal on rhs of a property-dot-sytax assignment
// must be replaced by its synthesize ast so getRewrittenText
// works as expected. In this case, what actually ends up on RHS
// is the blockTranscribed which is the helper function for the
// block literal; as in: self.c = ^() {[ace ARR];};
bool saveDisableReplaceStmt = DisableReplaceStmt;
DisableReplaceStmt = false;
RewriteFunctionBodyOrGlobalInitializer(BE->getBody());
DisableReplaceStmt = saveDisableReplaceStmt;
CurrentBody = SaveCurrentBody;
PropParentMap = 0;
ImportedLocalExternalDecls.clear();
// Now we snarf the rewritten text and stash it away for later use.
std::string Str = Rewrite.ConvertToString(BE->getBody());
std::string Str = Rewrite.getRewrittenText(BE->getSourceRange());
RewrittenBlockExprs[BE] = Str;

Stmt *blockTranscribed = SynthBlockInitExpr(BE, InnerBlockDeclRefs);
Expand Down
28 changes: 28 additions & 0 deletions test/Rewriter/rewrite-foreach-in-block.mm
@@ -0,0 +1,28 @@
// RUN: %clang_cc1 -x objective-c++ -Wno-return-type -fblocks -fms-extensions -rewrite-objc %s -o %t-rw.cpp
// RUN: %clang_cc1 -fsyntax-only -Wno-address-of-temporary -D"id=void*" -D"SEL=void*" -D"__declspec(X)=" %t-rw.cpp
// rdar:// 9878420

void objc_enumerationMutation(id);
void *sel_registerName(const char *);
typedef void (^CoreDAVCompletionBlock)(void);

@interface I
- (void)M;
- (id) ARR;
@property (readwrite, copy, nonatomic) CoreDAVCompletionBlock c;
@end

@implementation I
- (void)M {
I* ace;
self.c = ^() {
// sanity test for the changes.
[ace ARR];
for (I *privilege in [ace ARR]) { }
};
self.c = ^() {
// sanity test for the changes.
[ace ARR];
};
}
@end

0 comments on commit f23a0ff

Please sign in to comment.