r297961 - [ObjC][Sema] Avoid ARC performSelector error for 'self' selector

Alex Lorenz via cfe-commits cfe-commits at lists.llvm.org
Thu Mar 16 09:36:11 PDT 2017


Author: arphaman
Date: Thu Mar 16 11:36:11 2017
New Revision: 297961

URL: http://llvm.org/viewvc/llvm-project?rev=297961&view=rev
Log:
[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

Modified:
    cfe/trunk/lib/Sema/SemaExprObjC.cpp
    cfe/trunk/test/SemaObjC/arc-peformselector.m

Modified: cfe/trunk/lib/Sema/SemaExprObjC.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExprObjC.cpp?rev=297961&r1=297960&r2=297961&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaExprObjC.cpp (original)
+++ cfe/trunk/lib/Sema/SemaExprObjC.cpp Thu Mar 16 11:36:11 2017
@@ -3010,7 +3010,6 @@ ExprResult Sema::BuildInstanceMessage(Ex
               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>()) {

Modified: cfe/trunk/test/SemaObjC/arc-peformselector.m
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaObjC/arc-peformselector.m?rev=297961&r1=297960&r2=297961&view=diff
==============================================================================
--- cfe/trunk/test/SemaObjC/arc-peformselector.m (original)
+++ cfe/trunk/test/SemaObjC/arc-peformselector.m Thu Mar 16 11:36:11 2017
@@ -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; }




More information about the cfe-commits mailing list