From: Fariborz Jahanian Date: Mon, 25 Jan 2010 20:50:02 +0000 (+0000) Subject: Fixes a rewriting bug of access ivar of a variable cast X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=5bfc5364405370c388450ede09e15e3e5aef819b;p=clang Fixes a rewriting bug of access ivar of a variable cast to subclass. (Fixes radar 7575882). git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@94444 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Frontend/RewriteObjC.cpp b/lib/Frontend/RewriteObjC.cpp index 35d8dde8ea..19c714da3d 100644 --- a/lib/Frontend/RewriteObjC.cpp +++ b/lib/Frontend/RewriteObjC.cpp @@ -4308,7 +4308,16 @@ void RewriteObjC::RewriteCastExpr(CStyleCastExpr *CE) { TypeAsString.c_str(), TypeAsString.size()); return; } - + if (QT->isObjCObjectPointerType()) { + QualType ptee = QT->getAs()->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; diff --git a/test/Rewriter/rewrite-cast-ivar-access.mm b/test/Rewriter/rewrite-cast-ivar-access.mm new file mode 100644 index 0000000000..bdda689512 --- /dev/null +++ b/test/Rewriter/rewrite-cast-ivar-access.mm @@ -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 +