summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlex Lorenz <arphaman@gmail.com>2017-02-20 17:55:15 +0000
committerAlex Lorenz <arphaman@gmail.com>2017-02-20 17:55:15 +0000
commit51c0128310776a21dc5650d84f2a2f9a9ea62675 (patch)
treeea50698f956f2b564f50013f1ff3f22cfef3495a
parent2012dda9a0163ab7938cdb33fbe0ec6a08d9e0e2 (diff)
downloadbcm5719-llvm-51c0128310776a21dc5650d84f2a2f9a9ea62675.tar.gz
bcm5719-llvm-51c0128310776a21dc5650d84f2a2f9a9ea62675.zip
[Sema][ObjC] perform-selector ARC check should see @selector in parens
llvm-svn: 295674
-rw-r--r--clang/lib/Sema/SemaExprObjC.cpp3
-rw-r--r--clang/test/SemaObjC/arc-peformselector.m1
2 files changed, 3 insertions, 1 deletions
diff --git a/clang/lib/Sema/SemaExprObjC.cpp b/clang/lib/Sema/SemaExprObjC.cpp
index 7dbd660f53e..d770d1b5404 100644
--- a/clang/lib/Sema/SemaExprObjC.cpp
+++ b/clang/lib/Sema/SemaExprObjC.cpp
@@ -2920,7 +2920,8 @@ ExprResult Sema::BuildInstanceMessage(Expr *Receiver,
case OMF_performSelector:
if (Method && NumArgs >= 1) {
- if (ObjCSelectorExpr *SelExp = dyn_cast<ObjCSelectorExpr>(Args[0])) {
+ if (const auto *SelExp =
+ dyn_cast<ObjCSelectorExpr>(Args[0]->IgnoreParens())) {
Selector ArgSel = SelExp->getSelector();
ObjCMethodDecl *SelMethod =
LookupInstanceMethodInGlobalPool(ArgSel,
diff --git a/clang/test/SemaObjC/arc-peformselector.m b/clang/test/SemaObjC/arc-peformselector.m
index dec09e33ed6..80fd6d8884d 100644
--- a/clang/test/SemaObjC/arc-peformselector.m
+++ b/clang/test/SemaObjC/arc-peformselector.m
@@ -27,6 +27,7 @@
return [self performSelector : @selector(init)];
return [self performSelector : sel1]; // expected-warning {{performSelector may cause a leak because its selector is unknown}} \
// expected-note {{used here}}
+ return [self performSelector: (@selector(PlusZero))];
return [self performSelector : @selector(PlusZero)];
return [self performSelector : @selector(PlusOne)]; // expected-error {{performSelector names a selector which retains the object}}
OpenPOWER on IntegriCloud