From 1f2e6da2e3c7cc2f7e8997082d3053c3e8f7599d Mon Sep 17 00:00:00 2001 From: Alex Lorenz Date: Thu, 16 Mar 2017 16:36:11 +0000 Subject: [PATCH] [ObjC][Sema] Avoid ARC performSelector error for 'self' selector The instance method 'self' does not actually return an over-retained object, so we shouldn't report an error when it's used with 'performSelector'. rdar://31071620 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@297961 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Sema/SemaExprObjC.cpp | 1 - test/SemaObjC/arc-peformselector.m | 3 +++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/Sema/SemaExprObjC.cpp b/lib/Sema/SemaExprObjC.cpp index 99b31bc755..661fd81e9c 100644 --- a/lib/Sema/SemaExprObjC.cpp +++ b/lib/Sema/SemaExprObjC.cpp @@ -3010,7 +3010,6 @@ ExprResult Sema::BuildInstanceMessage(Expr *Receiver, case OMF_copy: case OMF_mutableCopy: case OMF_new: - case OMF_self: case OMF_init: // Issue error, unless ns_returns_not_retained. if (!SelMethod->hasAttr()) { diff --git a/test/SemaObjC/arc-peformselector.m b/test/SemaObjC/arc-peformselector.m index 80fd6d8884..e90ac6b1c8 100644 --- a/test/SemaObjC/arc-peformselector.m +++ b/test/SemaObjC/arc-peformselector.m @@ -8,6 +8,7 @@ - (id) init __attribute__((ns_returns_not_retained)); - (id)PlusZero; - (id)PlusOne __attribute__((ns_returns_retained)); // expected-note {{method 'PlusOne' declared here}} +- (id)self; @end @interface I : NSObject @@ -31,6 +32,8 @@ return [self performSelector : @selector(PlusZero)]; return [self performSelector : @selector(PlusOne)]; // expected-error {{performSelector names a selector which retains the object}} + + return [self performSelector: @selector(self)]; // No error, -self is not +1! } - (id)performSelector:(SEL)aSelector { return 0; } -- 2.50.1