[cfe-commits] r173097 - in /cfe/trunk: include/clang/Parse/Parser.h include/clang/Sema/Sema.h lib/Parse/ParseObjc.cpp lib/Sema/SemaExprObjC.cpp test/SemaObjC/selector-3.m

Fariborz Jahanian fjahanian at apple.com
Mon Jan 21 14:32:29 PST 2013


Author: fjahanian
Date: Mon Jan 21 16:32:29 2013
New Revision: 173097

URL: http://llvm.org/viewvc/llvm-project?rev=173097&view=rev
Log:
objectiveC: don't warn when in -Wselector mode and
an unimplemented selector is consumed by
"respondsToSelector:". // rdar://12938616

Modified:
    cfe/trunk/include/clang/Parse/Parser.h
    cfe/trunk/include/clang/Sema/Sema.h
    cfe/trunk/lib/Parse/ParseObjc.cpp
    cfe/trunk/lib/Sema/SemaExprObjC.cpp
    cfe/trunk/test/SemaObjC/selector-3.m

Modified: cfe/trunk/include/clang/Parse/Parser.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Parse/Parser.h?rev=173097&r1=173096&r2=173097&view=diff
==============================================================================
--- cfe/trunk/include/clang/Parse/Parser.h (original)
+++ cfe/trunk/include/clang/Parse/Parser.h Mon Jan 21 16:32:29 2013
@@ -1410,7 +1410,8 @@
   ExprResult ParseObjCDictionaryLiteral(SourceLocation AtLoc);
   ExprResult ParseObjCBoxedExpr(SourceLocation AtLoc);
   ExprResult ParseObjCEncodeExpression(SourceLocation AtLoc);
-  ExprResult ParseObjCSelectorExpression(SourceLocation AtLoc);
+  ExprResult ParseObjCSelectorExpression(SourceLocation AtLoc,
+                                         bool WarnSelector=true);
   ExprResult ParseObjCProtocolExpression(SourceLocation AtLoc);
   bool isSimpleObjCMessageExpression();
   ExprResult ParseObjCMessageExpression();

Modified: cfe/trunk/include/clang/Sema/Sema.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/Sema.h?rev=173097&r1=173096&r2=173097&view=diff
==============================================================================
--- cfe/trunk/include/clang/Sema/Sema.h (original)
+++ cfe/trunk/include/clang/Sema/Sema.h Mon Jan 21 16:32:29 2013
@@ -4280,7 +4280,8 @@
                                          SourceLocation AtLoc,
                                          SourceLocation SelLoc,
                                          SourceLocation LParenLoc,
-                                         SourceLocation RParenLoc);
+                                         SourceLocation RParenLoc,
+                                         bool WarnSelector);
 
   /// ParseObjCProtocolExpression - Build protocol expression for \@protocol
   ExprResult ParseObjCProtocolExpression(IdentifierInfo * ProtocolName,

Modified: cfe/trunk/lib/Parse/ParseObjc.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseObjc.cpp?rev=173097&r1=173096&r2=173097&view=diff
==============================================================================
--- cfe/trunk/lib/Parse/ParseObjc.cpp (original)
+++ cfe/trunk/lib/Parse/ParseObjc.cpp Mon Jan 21 16:32:29 2013
@@ -2425,6 +2425,8 @@
   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 @@
         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 @@
 
 ///     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 @@
   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) {

Modified: cfe/trunk/lib/Sema/SemaExprObjC.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExprObjC.cpp?rev=173097&r1=173096&r2=173097&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaExprObjC.cpp (original)
+++ cfe/trunk/lib/Sema/SemaExprObjC.cpp Mon Jan 21 16:32:29 2013
@@ -967,24 +967,27 @@
                                              SourceLocation AtLoc,
                                              SourceLocation SelLoc,
                                              SourceLocation LParenLoc,
-                                             SourceLocation RParenLoc) {
-  ObjCMethodDecl *Method = LookupInstanceMethodInGlobalPool(Sel,
-                             SourceRange(LParenLoc, RParenLoc), false, false);
-  if (!Method)
-    Method = LookupFactoryMethodInGlobalPool(Sel,
+                                             SourceLocation RParenLoc,
+                                             bool WarnSelector) {
+  if (WarnSelector) {
+    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, SelLoc));
+    }
   }
 
-  // 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()) {

Modified: cfe/trunk/test/SemaObjC/selector-3.m
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaObjC/selector-3.m?rev=173097&r1=173096&r2=173097&view=diff
==============================================================================
--- cfe/trunk/test/SemaObjC/selector-3.m (original)
+++ cfe/trunk/test/SemaObjC/selector-3.m Mon Jan 21 16:32:29 2013
@@ -52,3 +52,29 @@
 }
 @end
 
+// rdar://12938616
+ at class NSXPCConnection;
+
+ at interface NSObject
+ at end
+
+ at interface INTF : NSObject
+{
+  NSXPCConnection *cnx; // Comes in as a parameter.
+}
+- (void) Meth;
+ at end
+
+extern SEL MySelector(SEL s);
+
+ at implementation INTF
+- (void) Meth {
+  if( [cnx respondsToSelector:MySelector(@selector( _setQueue: ))] ) // expected-warning {{unimplemented selector '_setQueue:'}} 
+  {
+  }
+
+  if( [cnx respondsToSelector:@selector( _setQueueXX: )] ) // No warning here.
+  {
+  }
+}
+ at end





More information about the cfe-commits mailing list