]> granicus.if.org Git - clang/commitdiff
[ObjC][Sema] Avoid ARC performSelector error for 'self' selector
authorAlex Lorenz <arphaman@gmail.com>
Thu, 16 Mar 2017 16:36:11 +0000 (16:36 +0000)
committerAlex Lorenz <arphaman@gmail.com>
Thu, 16 Mar 2017 16:36:11 +0000 (16:36 +0000)
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
test/SemaObjC/arc-peformselector.m

index 99b31bc7553ff6a787524025bcb9f3fa73fea0e1..661fd81e9cea37d39b0c77295811b7831ee5cc67 100644 (file)
@@ -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<NSReturnsNotRetainedAttr>()) {
index 80fd6d8884d06883536c37db52f06ac20282f4b9..e90ac6b1c8d3f0046bfeb9d73d30dea486013927 100644 (file)
@@ -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; }