Fixes a rewriting bug of access ivar of a variable cast

to subclass. (Fixes radar 7575882).

llvm-svn: 94444
This commit is contained in:
Fariborz Jahanian 2010-01-25 20:50:02 +00:00
parent ec039dff43
commit d360ce9d57
2 changed files with 34 additions and 1 deletions

View File

@ -4308,7 +4308,16 @@ void RewriteObjC::RewriteCastExpr(CStyleCastExpr *CE) {
TypeAsString.c_str(), TypeAsString.size());
return;
}
if (QT->isObjCObjectPointerType()) {
QualType ptee = QT->getAs<ObjCObjectPointerType>()->getPointeeType();
std::string TypeAsString = "(struct ";
TypeAsString += ptee.getAsString();
TypeAsString += "_IMPL *";
TypeAsString += ")";
ReplaceText(LocStart, endBuf-startBuf+1,
TypeAsString.c_str(), TypeAsString.size());
return;
}
// advance the location to startArgList.
const char *argPtr = startBuf;

View File

@ -0,0 +1,24 @@
// RUN: %clang_cc1 -x objective-c++ -fblocks -fms-extensions -rewrite-objc %s -o %t-rw.cpp
// RUN: FileCheck -check-prefix LP --input-file=%t-rw.cpp %s
// radar 7575882
@interface F {
int supervar;
}
@end
@interface G : F {
@public
int ivar;
}
@end
@implementation G
- (void)foo:(F *)arg {
int q = arg->supervar;
int v = ((G *)arg)->ivar;
}
@end
// CHECK-LP: ((struct G_IMPL *)arg)->ivar