summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlex Lorenz <arphaman@gmail.com>2017-03-16 16:36:11 +0000
committerAlex Lorenz <arphaman@gmail.com>2017-03-16 16:36:11 +0000
commit3e54835ad75271d4420feb9a0e29b23b28d03ef5 (patch)
treec6cd6a9b73858d1cb5b77b5f0667a5fbfb1ad563
parent8508e87998cefaa07fd48e78079dadbf80fc51d4 (diff)
downloadbcm5719-llvm-3e54835ad75271d4420feb9a0e29b23b28d03ef5.tar.gz
bcm5719-llvm-3e54835ad75271d4420feb9a0e29b23b28d03ef5.zip
[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 llvm-svn: 297961
-rw-r--r--clang/lib/Sema/SemaExprObjC.cpp1
-rw-r--r--clang/test/SemaObjC/arc-peformselector.m3
2 files changed, 3 insertions, 1 deletions
diff --git a/clang/lib/Sema/SemaExprObjC.cpp b/clang/lib/Sema/SemaExprObjC.cpp
index 99b31bc7553..661fd81e9ce 100644
--- a/clang/lib/Sema/SemaExprObjC.cpp
+++ b/clang/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<NSReturnsNotRetainedAttr>()) {
diff --git a/clang/test/SemaObjC/arc-peformselector.m b/clang/test/SemaObjC/arc-peformselector.m
index 80fd6d8884d..e90ac6b1c8d 100644
--- a/clang/test/SemaObjC/arc-peformselector.m
+++ b/clang/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; }
OpenPOWER on IntegriCloud