diff --git a/clang/lib/ARCMigrate/ObjCMT.cpp b/clang/lib/ARCMigrate/ObjCMT.cpp index af9c472550ed..d017acf52782 100644 --- a/clang/lib/ARCMigrate/ObjCMT.cpp +++ b/clang/lib/ARCMigrate/ObjCMT.cpp @@ -242,7 +242,8 @@ namespace { const NSAPI &NS, edit::Commit &commit, const ParentMap *PMap) { if (!Msg || Msg->isImplicit() || - Msg->getReceiverKind() != ObjCMessageExpr::Instance) + (Msg->getReceiverKind() != ObjCMessageExpr::Instance && + Msg->getReceiverKind() != ObjCMessageExpr::SuperInstance)) return false; const ObjCMethodDecl *Method = Msg->getMethodDecl(); if (!Method) @@ -260,12 +261,17 @@ namespace { return false; SourceRange MsgRange = Msg->getSourceRange(); + bool ReceiverIsSuper = + (Msg->getReceiverKind() == ObjCMessageExpr::SuperInstance); + // for 'super' receiver is nullptr. const Expr *receiver = Msg->getInstanceReceiver(); - bool NeedsParen = subscriptOperatorNeedsParens(receiver); + bool NeedsParen = + ReceiverIsSuper ? false : subscriptOperatorNeedsParens(receiver); bool IsGetter = (Msg->getNumArgs() == 0); if (IsGetter) { // Find space location range between receiver expression and getter method. - SourceLocation BegLoc = receiver->getLocEnd(); + SourceLocation BegLoc = + ReceiverIsSuper ? Msg->getSuperLoc() : receiver->getLocEnd(); BegLoc = PP.getLocForEndOfToken(BegLoc); SourceLocation EndLoc = Msg->getSelectorLoc(0); SourceRange SpaceRange(BegLoc, EndLoc); @@ -285,9 +291,8 @@ namespace { commit.replace(SourceRange(MsgRange.getBegin(), MsgRange.getBegin()), ""); commit.replace(SourceRange(MsgRange.getEnd(), MsgRange.getEnd()), ""); } else { - SourceRange ReceiverRange = receiver->getSourceRange(); if (NeedsParen) - commit.insertWrap("(", ReceiverRange, ")"); + commit.insertWrap("(", receiver->getSourceRange(), ")"); std::string PropertyDotString = "."; PropertyDotString += Prop->getName(); PropertyDotString += " ="; @@ -295,7 +300,8 @@ namespace { const Expr *RHS = Args[0]; if (!RHS) return false; - SourceLocation BegLoc = ReceiverRange.getEnd(); + SourceLocation BegLoc = + ReceiverIsSuper ? Msg->getSuperLoc() : receiver->getLocEnd(); BegLoc = PP.getLocForEndOfToken(BegLoc); SourceLocation EndLoc = RHS->getLocStart(); EndLoc = EndLoc.getLocWithOffset(-1); diff --git a/clang/test/ARCMT/objcmt-property-dot-syntax.m b/clang/test/ARCMT/objcmt-property-dot-syntax.m index 42aade5aca2e..0e25abcb89ec 100644 --- a/clang/test/ARCMT/objcmt-property-dot-syntax.m +++ b/clang/test/ARCMT/objcmt-property-dot-syntax.m @@ -37,3 +37,25 @@ P* fun(); - (P*) MethodReturnsPObj { return 0; } @end + +// rdar://19140267 +@interface Sub : P +@end + +@implementation Sub +- (int) Meth : (P*)array { + [super setCount : 100]; + + [super setCount : [array count]]; + + [[super PropertyReturnsPObj] setCount : [array count]]; + + [super setCount : (i1+i2*i3 - 100)]; + + return [super count] - + [(P*)0 count] + [array count] + + [fun() count] - + [[super PropertyReturnsPObj] count] + + [self->obj count]; +} +@end diff --git a/clang/test/ARCMT/objcmt-property-dot-syntax.m.result b/clang/test/ARCMT/objcmt-property-dot-syntax.m.result index 88006e9fc59e..6822d44ac0a5 100644 --- a/clang/test/ARCMT/objcmt-property-dot-syntax.m.result +++ b/clang/test/ARCMT/objcmt-property-dot-syntax.m.result @@ -37,3 +37,25 @@ P* fun(); - (P*) MethodReturnsPObj { return 0; } @end + +// rdar://19140267 +@interface Sub : P +@end + +@implementation Sub +- (int) Meth : (P*)array { + super.count = 100; + + super.count = array.count; + + super.PropertyReturnsPObj.count = array.count; + + super.count = (i1+i2*i3 - 100); + + return super.count - + ((P*)0).count + array.count + + fun().count - + super.PropertyReturnsPObj.count + + self->obj.count; +} +@end