diff options
author | Fariborz Jahanian <fjahanian@apple.com> | 2013-01-22 18:35:43 +0000 |
---|---|---|
committer | Fariborz Jahanian <fjahanian@apple.com> | 2013-01-22 18:35:43 +0000 |
commit | 02447d80e4638aac8a40e27de50f7f990a6d0b2a (patch) | |
tree | e29b105baa57259a4d6af724fd9b5d98a739a485 /clang/lib/Sema/SemaExprObjC.cpp | |
parent | 44c3145938573088d5f89b7557bd32cb70359e26 (diff) | |
download | bcm5719-llvm-02447d80e4638aac8a40e27de50f7f990a6d0b2a.tar.gz bcm5719-llvm-02447d80e4638aac8a40e27de50f7f990a6d0b2a.zip |
objectiveC (take two): don't warn when in -Wselector mode and
an unimplemented selector is consumed by
"respondsToSelector:". // rdar://12938616
llvm-svn: 173179
Diffstat (limited to 'clang/lib/Sema/SemaExprObjC.cpp')
-rw-r--r-- | clang/lib/Sema/SemaExprObjC.cpp | 48 |
1 files changed, 30 insertions, 18 deletions
diff --git a/clang/lib/Sema/SemaExprObjC.cpp b/clang/lib/Sema/SemaExprObjC.cpp index 12f8d67d30f..87da4401916 100644 --- a/clang/lib/Sema/SemaExprObjC.cpp +++ b/clang/lib/Sema/SemaExprObjC.cpp @@ -967,27 +967,24 @@ ExprResult Sema::ParseObjCSelectorExpression(Selector Sel, SourceLocation AtLoc, SourceLocation SelLoc, SourceLocation LParenLoc, - SourceLocation RParenLoc, - bool WarnSelector) { - if (WarnSelector) { - ObjCMethodDecl *Method = LookupInstanceMethodInGlobalPool(Sel, - SourceRange(LParenLoc, RParenLoc), false, false); - if (!Method) - Method = LookupFactoryMethodInGlobalPool(Sel, + SourceLocation RParenLoc) { + ObjCMethodDecl *Method = LookupInstanceMethodInGlobalPool(Sel, + SourceRange(LParenLoc, RParenLoc), false, false); + if (!Method) + Method = LookupFactoryMethodInGlobalPool(Sel, SourceRange(LParenLoc, RParenLoc)); - if (!Method) - Diag(SelLoc, diag::warn_undeclared_selector) << Sel; + if (!Method) + Diag(SelLoc, diag::warn_undeclared_selector) << Sel; - if (!Method || - Method->getImplementationControl() != ObjCMethodDecl::Optional) { - llvm::DenseMap<Selector, SourceLocation>::iterator Pos - = ReferencedSelectors.find(Sel); - if (Pos == ReferencedSelectors.end()) - ReferencedSelectors.insert(std::make_pair(Sel, SelLoc)); - } + if (!Method || + Method->getImplementationControl() != ObjCMethodDecl::Optional) { + llvm::DenseMap<Selector, SourceLocation>::iterator Pos + = ReferencedSelectors.find(Sel); + if (Pos == ReferencedSelectors.end()) + ReferencedSelectors.insert(std::make_pair(Sel, AtLoc)); } - // In ARC, forbid the user from using @selector for + // In ARC, forbid the user from using @selector for // retain/release/autorelease/dealloc/retainCount. if (getLangOpts().ObjCAutoRefCount) { switch (Sel.getMethodFamily()) { @@ -2464,6 +2461,18 @@ ExprResult Sema::BuildInstanceMessage(Expr *Receiver, return MaybeBindToTemporary(Result); } +static void RemoveSelectorFromWarningCache(Sema &S, Expr* Arg) { + if (ObjCSelectorExpr *OSE = + dyn_cast<ObjCSelectorExpr>(Arg->IgnoreParenCasts())) { + Selector Sel = OSE->getSelector(); + SourceLocation Loc = OSE->getAtLoc(); + llvm::DenseMap<Selector, SourceLocation>::iterator Pos + = S.ReferencedSelectors.find(Sel); + if (Pos != S.ReferencedSelectors.end() && Pos->second == Loc) + S.ReferencedSelectors.erase(Pos); + } +} + // ActOnInstanceMessage - used for both unary and keyword messages. // ArgExprs is optional - if it is present, the number of expressions // is obtained from Sel.getNumArgs(). @@ -2476,7 +2485,10 @@ ExprResult Sema::ActOnInstanceMessage(Scope *S, MultiExprArg Args) { if (!Receiver) return ExprError(); - + IdentifierInfo *SelectorId = &Context.Idents.get("respondsToSelector"); + if (Sel == Context.Selectors.getUnarySelector(SelectorId)) + RemoveSelectorFromWarningCache(*this, Args[0]); + return BuildInstanceMessage(Receiver, Receiver->getType(), /*SuperLoc=*/SourceLocation(), Sel, /*Method=*/0, LBracLoc, SelectorLocs, RBracLoc, Args); |