objective-c rewrite: Fixes rewriting of objective-c collection

statement inside a block. // rdar://9878420

llvm-svn: 136717
This commit is contained in:
Fariborz Jahanian 2011-08-02 20:28:46 +00:00
parent c48e10cd54
commit c7c346fd13
2 changed files with 37 additions and 1 deletions

View File

@ -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);

View File

@ -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