diff --git a/clang/lib/Frontend/RewriteObjC.cpp b/clang/lib/Frontend/RewriteObjC.cpp index 35d8dde8eaab..19c714da3daa 100644 --- a/clang/lib/Frontend/RewriteObjC.cpp +++ b/clang/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/clang/test/Rewriter/rewrite-cast-ivar-access.mm b/clang/test/Rewriter/rewrite-cast-ivar-access.mm new file mode 100644 index 000000000000..bdda68951218 --- /dev/null +++ b/clang/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 +