diff options
| author | Alex Lorenz <arphaman@gmail.com> | 2017-02-20 17:55:15 +0000 |
|---|---|---|
| committer | Alex Lorenz <arphaman@gmail.com> | 2017-02-20 17:55:15 +0000 |
| commit | 51c0128310776a21dc5650d84f2a2f9a9ea62675 (patch) | |
| tree | ea50698f956f2b564f50013f1ff3f22cfef3495a | |
| parent | 2012dda9a0163ab7938cdb33fbe0ec6a08d9e0e2 (diff) | |
| download | bcm5719-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.cpp | 3 | ||||
| -rw-r--r-- | clang/test/SemaObjC/arc-peformselector.m | 1 |
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}} |

