From: Fariborz Jahanian Date: Tue, 10 Apr 2012 22:06:54 +0000 (+0000) Subject: modern objective-c translation: writing container X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=88ec6100812d8f551a824d7884e21aaa68138330;p=clang modern objective-c translation: writing container subscripting. // rdar://11203853 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@154441 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Rewrite/RewriteModernObjC.cpp b/lib/Rewrite/RewriteModernObjC.cpp index 162f7a5289..4be7eb806f 100644 --- a/lib/Rewrite/RewriteModernObjC.cpp +++ b/lib/Rewrite/RewriteModernObjC.cpp @@ -1325,7 +1325,8 @@ Stmt *RewriteModernObjC::RewritePropertyOrImplicitSetter(PseudoObjectExpr *Pseud // Because the rewriter doesn't allow us to rewrite rewritten code, // we need to suppress rewriting the sub-statements. - Expr *Base, *RHS; + Expr *Base; + SmallVector Args; { DisableReplaceStmtScope S(*this); @@ -1336,11 +1337,15 @@ Stmt *RewriteModernObjC::RewritePropertyOrImplicitSetter(PseudoObjectExpr *Pseud Base = cast(Base)->getSourceExpr(); Base = cast(RewriteFunctionBodyOrGlobalInitializer(Base)); } - - // Rebuild the RHS. - RHS = cast(PseudoOp->getSyntacticForm())->getRHS(); - RHS = cast(RHS)->getSourceExpr(); - RHS = cast(RewriteFunctionBodyOrGlobalInitializer(RHS)); + + unsigned numArgs = OldMsg->getNumArgs(); + for (unsigned i = 0; i < numArgs; i++) { + Expr *Arg = OldMsg->getArg(i); + if (isa(Arg)) + Arg = cast(Arg)->getSourceExpr(); + Arg = cast(RewriteFunctionBodyOrGlobalInitializer(Arg)); + Args.push_back(Arg); + } } // TODO: avoid this copy. @@ -1357,7 +1362,7 @@ Stmt *RewriteModernObjC::RewritePropertyOrImplicitSetter(PseudoObjectExpr *Pseud OldMsg->getSelector(), SelLocs, OldMsg->getMethodDecl(), - RHS, + Args, OldMsg->getRightLoc(), OldMsg->isImplicit()); break; @@ -1370,7 +1375,7 @@ Stmt *RewriteModernObjC::RewritePropertyOrImplicitSetter(PseudoObjectExpr *Pseud OldMsg->getSelector(), SelLocs, OldMsg->getMethodDecl(), - RHS, + Args, OldMsg->getRightLoc(), OldMsg->isImplicit()); break; @@ -1386,7 +1391,7 @@ Stmt *RewriteModernObjC::RewritePropertyOrImplicitSetter(PseudoObjectExpr *Pseud OldMsg->getSelector(), SelLocs, OldMsg->getMethodDecl(), - RHS, + Args, OldMsg->getRightLoc(), OldMsg->isImplicit()); break; @@ -1408,20 +1413,27 @@ Stmt *RewriteModernObjC::RewritePropertyOrImplicitGetter(PseudoObjectExpr *Pseud // Because the rewriter doesn't allow us to rewrite rewritten code, // we need to suppress rewriting the sub-statements. Expr *Base = 0; + SmallVector Args; { DisableReplaceStmtScope S(*this); - // Rebuild the base expression if we have one. if (OldMsg->getReceiverKind() == ObjCMessageExpr::Instance) { Base = OldMsg->getInstanceReceiver(); Base = cast(Base)->getSourceExpr(); Base = cast(RewriteFunctionBodyOrGlobalInitializer(Base)); } + unsigned numArgs = OldMsg->getNumArgs(); + for (unsigned i = 0; i < numArgs; i++) { + Expr *Arg = OldMsg->getArg(i); + if (isa(Arg)) + Arg = cast(Arg)->getSourceExpr(); + Arg = cast(RewriteFunctionBodyOrGlobalInitializer(Arg)); + Args.push_back(Arg); + } } // Intentionally empty. SmallVector SelLocs; - SmallVector Args; ObjCMessageExpr *NewMsg = 0; switch (OldMsg->getReceiverKind()) { diff --git a/test/Rewriter/objc-modern-container-subscript.mm b/test/Rewriter/objc-modern-container-subscript.mm new file mode 100644 index 0000000000..d6bb9c2eb3 --- /dev/null +++ b/test/Rewriter/objc-modern-container-subscript.mm @@ -0,0 +1,48 @@ +// RUN: %clang_cc1 -x objective-c++ -fblocks -fms-extensions -rewrite-objc %s -o %t-rw.cpp +// RUN: %clang_cc1 -fsyntax-only -fblocks -Wno-address-of-temporary -D"Class=void*" -D"id=void*" -D"SEL=void*" -D"__declspec(X)=" %t-rw.cpp +// rdar://11203853 + +void *sel_registerName(const char *); + +typedef unsigned int size_t; +@protocol P @end + +@interface NSMutableArray +#if __has_feature(objc_subscripting) +- (id)objectAtIndexedSubscript:(size_t)index; +- (void)setObject:(id)object atIndexedSubscript:(size_t)index; +#endif +@end + +#if __has_feature(objc_subscripting) +@interface XNSMutableArray +- (id)objectAtIndexedSubscript:(size_t)index; +- (void)setObject:(id)object atIndexedSubscript:(size_t)index; +#endif +@end + +@interface NSMutableDictionary +- (id)objectForKeyedSubscript:(id)key; +- (void)setObject:(id)object forKeyedSubscript:(id)key; +@end + +@class NSString; + +int main() { + NSMutableArray

* array; + id oldObject = array[10]; + + array[10] = oldObject; + + id unknown_array; + oldObject = unknown_array[1]; + + unknown_array[1] = oldObject; + + NSMutableDictionary *dictionary; + NSString *key; + id newObject; + oldObject = dictionary[key]; + dictionary[key] = newObject; // replace oldObject with newObject +} +