diff options
author | Alex Lorenz <arphaman@gmail.com> | 2017-03-16 16:36:11 +0000 |
---|---|---|
committer | Alex Lorenz <arphaman@gmail.com> | 2017-03-16 16:36:11 +0000 |
commit | 3e54835ad75271d4420feb9a0e29b23b28d03ef5 (patch) | |
tree | c6cd6a9b73858d1cb5b77b5f0667a5fbfb1ad563 | |
parent | 8508e87998cefaa07fd48e78079dadbf80fc51d4 (diff) | |
download | bcm5719-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.cpp | 1 | ||||
-rw-r--r-- | clang/test/SemaObjC/arc-peformselector.m | 3 |
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; } |