aboutsummaryrefslogtreecommitdiff
path: root/Driver/RewriteTest.cpp
diff options
context:
space:
mode:
authorSteve Naroff <snaroff@apple.com>2008-03-12 23:15:19 +0000
committerSteve Naroff <snaroff@apple.com>2008-03-12 23:15:19 +0000
commit5518e7caf365158c5a03fc34d0d05d5a4981fa05 (patch)
tree9f656b296b7d5b92f2e0a40293b58a02cc169caa /Driver/RewriteTest.cpp
parent361fa8ecd122a5b06c2c59d44419e202f42e1c5d (diff)
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. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@48309 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'Driver/RewriteTest.cpp')
-rw-r--r--Driver/RewriteTest.cpp15
1 files changed, 8 insertions, 7 deletions
diff --git a/Driver/RewriteTest.cpp b/Driver/RewriteTest.cpp
index 8140197351..d53f23d00c 100644
--- a/Driver/RewriteTest.cpp
+++ b/Driver/RewriteTest.cpp
@@ -764,10 +764,6 @@ void RewriteTest::RewriteInterfaceDecl(ObjCInterfaceDecl *ClassDecl) {
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 @@ Stmt *RewriteTest::RewriteObjCIvarRefExpr(ObjCIvarRefExpr *IV) {
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 @@ Stmt *RewriteTest::RewriteObjCIvarRefExpr(ObjCIvarRefExpr *IV) {
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 @@ Stmt *RewriteTest::SynthMessageExpr(ObjCMessageExpr *Exp) {
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))