Implement an important missing warning when a selector
is searched for in the global pool. It already uncovered 
a clang bug in message selection.



git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@65974 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Sema/SemaExprObjC.cpp b/lib/Sema/SemaExprObjC.cpp
index 8b452af..39a89d6 100644
--- a/lib/Sema/SemaExprObjC.cpp
+++ b/lib/Sema/SemaExprObjC.cpp
@@ -450,16 +450,28 @@
     }
     if (!Method) {
       // If we have an implementation in scope, check "private" methods.
-      if (ClassDecl)
+      if (ClassDecl) {
         if (ObjCImplementationDecl *ImpDecl = 
               ObjCImplementations[ClassDecl->getIdentifier()])
           Method = ImpDecl->getInstanceMethod(Sel);
-          // If we still haven't found a method, look in the global pool. This
-          // behavior isn't very desirable, however we need it for GCC
-          // compatibility. FIXME: should we deviate??
-          if (!Method && OCIType->qual_empty())
-            Method = LookupInstanceMethodInGlobalPool(
-                                 Sel, SourceRange(lbrac,rbrac));
+        // Look through local category implementations associated with the class.
+        if (!Method) {
+          for (unsigned i = 0; i < ObjCCategoryImpls.size() && !Method; i++) {
+            if (ObjCCategoryImpls[i]->getClassInterface() == ClassDecl)
+              Method = ObjCCategoryImpls[i]->getInstanceMethod(Sel);
+          }
+        }
+      }
+      // If we still haven't found a method, look in the global pool. This
+      // behavior isn't very desirable, however we need it for GCC
+      // compatibility. FIXME: should we deviate??
+      if (!Method && OCIType->qual_empty()) {
+        Method = LookupInstanceMethodInGlobalPool(
+                             Sel, SourceRange(lbrac,rbrac));
+        if (Method && !OCIType->getDecl()->isForwardDecl())
+          Diag(lbrac, diag::warn_maynot_respond) 
+            << OCIType->getDecl()->getIdentifier()->getName() << Sel;
+      }
     }
     if (Method && DiagnoseUseOfDecl(Method, receiverLoc))
       return true;