[cfe-commits] r48309 - in /cfe/trunk: Driver/RewriteTest.cpp test/Rewriter/objc-ivar-receiver-1.m

Steve Naroff snaroff at apple.com
Wed Mar 12 16:15:20 PDT 2008


Author: snaroff
Date: Wed Mar 12 18:15:19 2008
New Revision: 48309

URL: http://llvm.org/viewvc/llvm-project?rev=48309&view=rev
Log:
Two fixes to RewriteTest::RewriteObjCIvarRefExpr():
- For explicit ivar refers, make sure the cast is propagated to the AST.
- Don't free the base (since it is still in use).
This fixes the recent regression to test/Rewriter/objc-ivar-receiver-1.m.

Modified:
    cfe/trunk/Driver/RewriteTest.cpp
    cfe/trunk/test/Rewriter/objc-ivar-receiver-1.m

Modified: cfe/trunk/Driver/RewriteTest.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/Driver/RewriteTest.cpp?rev=48309&r1=48308&r2=48309&view=diff

==============================================================================
--- cfe/trunk/Driver/RewriteTest.cpp (original)
+++ cfe/trunk/Driver/RewriteTest.cpp Wed Mar 12 18:15:19 2008
@@ -764,10 +764,6 @@
   ReplaceText(ClassDecl->getAtEndLoc(), 0, "// ", 3);
 }
 
-/// FIXME: Investigate the following comment...
-/// This code is not right. It seems unnecessary. It breaks use of 
-/// ivar reference used as 'receiver' of an expression; as in:
-/// [newInv->_container addObject:0];
 Stmt *RewriteTest::RewriteObjCIvarRefExpr(ObjCIvarRefExpr *IV) {
   ObjCIvarDecl *D = IV->getDecl();
   if (CurMethodDecl) {
@@ -778,6 +774,8 @@
         ObjCInterfaceDecl *clsDeclared = 0;
         intT->getDecl()->lookupInstanceVariable(D->getIdentifier(), clsDeclared);
         assert(clsDeclared && "RewriteObjCIvarRefExpr(): Can't find class");
+        
+        // Synthesize an explicit cast to gain access to the ivar.
         std::string RecName = clsDeclared->getIdentifier()->getName();
         RecName += "_IMPL";
         IdentifierInfo *II = &Context->Idents.get(RecName.c_str());
@@ -794,12 +792,16 @@
           return ME;
         } else {
           ReplaceStmt(IV->getBase(), PE);
-          delete IV->getBase();
-          return PE;
+          // Cannot delete IV->getBase(), since PE points to it.
+          // Replace the old base with the cast. This is important when doing
+          // embedded rewrites. For example, [newInv->_container addObject:0].
+          IV->setBase(PE); 
+          return IV;
         }
       }
     }
   }
+  // FIXME: Implement public ivar access from a function.
   Expr *Replacement = new MemberExpr(IV->getBase(), true, D, 
                                      IV->getLocation(), D->getType());
   ReplaceStmt(IV, Replacement);
@@ -1975,7 +1977,6 @@
                                SourceLocation());
       MsgExprs.push_back(Unop);
     } else {
-      //recExpr->dump();
       // Remove all type-casts because it may contain objc-style types; e.g.
       // Foo<Proto> *.
       while (CastExpr *CE = dyn_cast<CastExpr>(recExpr))

Modified: cfe/trunk/test/Rewriter/objc-ivar-receiver-1.m
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Rewriter/objc-ivar-receiver-1.m?rev=48309&r1=48308&r2=48309&view=diff

==============================================================================
--- cfe/trunk/test/Rewriter/objc-ivar-receiver-1.m (original)
+++ cfe/trunk/test/Rewriter/objc-ivar-receiver-1.m Wed Mar 12 18:15:19 2008
@@ -17,6 +17,7 @@
 
 + (NSInvocation *)invocationWithMethodSignature {
     NSInvocation *newInv;
+    id obj = newInv->_container;
     [newInv->_container addObject:0];
    return 0;
 }





More information about the cfe-commits mailing list