objective-C: warn under a flag if missing argument
name results in unintended selector name. 
// rdar://12263549


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@163634 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Parse/ParseObjc.cpp b/lib/Parse/ParseObjc.cpp
index 977d4d9..6d5f35a 100644
--- a/lib/Parse/ParseObjc.cpp
+++ b/lib/Parse/ParseObjc.cpp
@@ -1031,7 +1031,7 @@
                             Scope::FunctionPrototypeScope|Scope::DeclScope);
 
   AttributePool allParamAttrs(AttrFactory);
-  
+  bool warnSelectorName = false;
   while (1) {
     ParsedAttributes paramAttrs(AttrFactory);
     Sema::ObjCArgInfo ArgInfo;
@@ -1100,8 +1100,16 @@
     
     // Check for another keyword selector.
     SelIdent = ParseObjCSelectorPiece(selLoc);
-    if (!SelIdent && Tok.isNot(tok::colon))
-      break;
+    if (!SelIdent) {
+      if (Tok.isNot(tok::colon))
+        break;
+      // parameter name was not followed with selector name; as in:
+      // - (void) Meth: (id) Name:(id)Arg2; Issue a warning as user
+      // might have meant: - (void) Meth: (id)Arg1 Name:(id)Arg2;
+      Diag(Tok, diag::warn_missing_argument_name); // missing argument name.
+      warnSelectorName = true;
+    }
+    
     // We have a selector or a colon, continue parsing.
   }
 
@@ -1142,6 +1150,9 @@
   
   Selector Sel = PP.getSelectorTable().getSelector(KeyIdents.size(),
                                                    &KeyIdents[0]);
+  if (warnSelectorName)
+    Diag(mLoc, diag::note_missing_argument_name) << Sel.getAsString();
+  
   Decl *Result
        = Actions.ActOnMethodDeclaration(getCurScope(), mLoc, Tok.getLocation(),
                                         mType, DSRet, ReturnType,