Fix rewriter to match recent changes in property ref

AST.

llvm-svn: 120919
This commit is contained in:
Fariborz Jahanian 2010-12-04 21:22:13 +00:00
parent fbd47dcc55
commit 83e7d5a90a
3 changed files with 14 additions and 12 deletions

View File

@ -1361,12 +1361,20 @@ Stmt *RewriteObjC::RewritePropertyOrImplicitGetter(Expr *PropOrGetterRefExpr) {
if (!PropParentMap)
PropParentMap = new ParentMap(CurrentBody);
bool NestedPropertyRef = false;
Stmt *Parent = PropParentMap->getParent(PropOrGetterRefExpr);
if (Parent && isa<ObjCPropertyRefExpr>(Parent)) {
ImplicitCastExpr*ICE=0;
if (Parent)
if ((ICE = dyn_cast<ImplicitCastExpr>(Parent))) {
assert((ICE->getCastKind() == CK_GetObjCProperty)
&& "RewritePropertyOrImplicitGetter");
Parent = PropParentMap->getParent(Parent);
NestedPropertyRef = (Parent && isa<ObjCPropertyRefExpr>(Parent));
}
if (NestedPropertyRef) {
// We stash away the ReplacingStmt since actually doing the
// replacement/rewrite won't work for nested getters (e.g. obj.p.i)
PropGetters[PropOrGetterRefExpr] = ReplacingStmt;
PropGetters[ICE] = ReplacingStmt;
// NOTE: We don't want to call MsgExpr->Destroy(), as it holds references
// to things that stay around.
Context->Deallocate(MsgExpr);

View File

@ -1,9 +1,7 @@
// RUN: %clang_cc1 -rewrite-objc %s -o -
// RUN: %clang_cc1 -x objective-c -Wno-return-type -fblocks -fms-extensions -rewrite-objc %s -o %t-rw.cpp
// RUN: %clang_cc1 -fsyntax-only -fms-extensions -Wno-address-of-temporary -Did="void *" -D"SEL=void*" -D"__declspec(X)=" %t-rw.cpp
// Fariborz approved this being xfail'ed during the addition
// of explicit lvalue-to-rvalue conversions.
// RUN: false
// XFAIL: *
void *sel_registerName(const char *);
@interface Foo {
int i;

View File

@ -2,10 +2,6 @@
// RUN: %clang_cc1 -fsyntax-only -fms-extensions -Wno-address-of-temporary -Did="void *" -D"SEL=void*" -D"__declspec(X)=" %t-rw.cpp
// radar 8608293
// Fariborz approved this being xfail'ed during the addition
// of explicit lvalue-to-rvalue conversions.
// XFAIL: *
void *sel_registerName(const char *);
extern "C" void nowarn(id);