diff options
author | Fariborz Jahanian <fjahanian@apple.com> | 2013-01-21 22:32:29 +0000 |
---|---|---|
committer | Fariborz Jahanian <fjahanian@apple.com> | 2013-01-21 22:32:29 +0000 |
commit | f11ccc1cbb26cacac36abebe6ce9add43bf32585 (patch) | |
tree | 5f23d3c5f238a370aacf3a2f5b98268460c58db0 /lib/Parse/ParseObjc.cpp | |
parent | a37ce617af7300eee3ceab435021c342e62c5661 (diff) | |
download | clang-f11ccc1cbb26cacac36abebe6ce9add43bf32585.tar.gz clang-f11ccc1cbb26cacac36abebe6ce9add43bf32585.tar.bz2 clang-f11ccc1cbb26cacac36abebe6ce9add43bf32585.tar.xz |
objectiveC: don't warn when in -Wselector mode and
an unimplemented selector is consumed by
"respondsToSelector:". // rdar://12938616
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@173097 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Parse/ParseObjc.cpp')
-rw-r--r-- | lib/Parse/ParseObjc.cpp | 25 |
1 files changed, 22 insertions, 3 deletions
diff --git a/lib/Parse/ParseObjc.cpp b/lib/Parse/ParseObjc.cpp index ae1e19cc6d..47c22d9bd0 100644 --- a/lib/Parse/ParseObjc.cpp +++ b/lib/Parse/ParseObjc.cpp @@ -2425,6 +2425,8 @@ Parser::ParseObjCMessageExpressionBody(SourceLocation LBracLoc, ExprVector KeyExprs; if (Tok.is(tok::colon)) { + bool RespondsToSelector = + selIdent && selIdent->isStr("respondsToSelector"); while (1) { // Each iteration parses a single keyword argument. KeyIdents.push_back(selIdent); @@ -2463,7 +2465,22 @@ Parser::ParseObjCMessageExpressionBody(SourceLocation LBracLoc, return ExprError(); } - ExprResult Res(ParseAssignmentExpression()); + ExprResult Res; + if (RespondsToSelector) { + if (Tok.is(tok::at)) { + // Special handling for 'respondsToSelector:' which must not warn + // on use of @selector expression as its sole argument. + Token AfterAt = GetLookAheadToken(1); + if (AfterAt.isObjCAtKeyword(tok::objc_selector)) { + SourceLocation AtLoc = ConsumeToken(); + Res = ParseObjCSelectorExpression(AtLoc, false); + } + } + RespondsToSelector = false; + } + if (!Res.get()) + Res = ParseAssignmentExpression(); + if (Res.isInvalid()) { // We must manually skip to a ']', otherwise the expression skipper will // stop at the ']' when it skips to the ';'. We want it to skip beyond @@ -2797,7 +2814,8 @@ Parser::ParseObjCProtocolExpression(SourceLocation AtLoc) { /// objc-selector-expression /// @selector '(' objc-keyword-selector ')' -ExprResult Parser::ParseObjCSelectorExpression(SourceLocation AtLoc) { +ExprResult Parser::ParseObjCSelectorExpression(SourceLocation AtLoc, + bool WarnSelector) { SourceLocation SelectorLoc = ConsumeToken(); if (Tok.isNot(tok::l_paren)) @@ -2855,7 +2873,8 @@ ExprResult Parser::ParseObjCSelectorExpression(SourceLocation AtLoc) { Selector Sel = PP.getSelectorTable().getSelector(nColons, &KeyIdents[0]); return Actions.ParseObjCSelectorExpression(Sel, AtLoc, SelectorLoc, T.getOpenLocation(), - T.getCloseLocation()); + T.getCloseLocation(), + WarnSelector); } void Parser::ParseLexedObjCMethodDefs(LexedMethod &LM, bool parseMethod) { |