forked from OSchip/llvm-project
objective-c rewrite: Fixes rewriting of objective-c collection
statement inside a block. // rdar://9878420 llvm-svn: 136717
This commit is contained in:
parent
c48e10cd54
commit
c7c346fd13
|
@ -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);
|
||||
|
|
|
@ -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
|
Loading…
Reference in New Issue