diff options
author | Fariborz Jahanian <fjahanian@apple.com> | 2012-09-17 19:15:26 +0000 |
---|---|---|
committer | Fariborz Jahanian <fjahanian@apple.com> | 2012-09-17 19:15:26 +0000 |
commit | 08602359845e668194d111b794b8965358babfe6 (patch) | |
tree | 81a7db24c36c93b5c1f6a6cda48b030f402c2e16 /lib/Parse/ParseObjc.cpp | |
parent | 5fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0 (diff) |
objective-C: issue warning when there is no whitespace
between objc method parameter name and colon.
// rdar://12263549
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@164047 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Parse/ParseObjc.cpp')
-rw-r--r-- | lib/Parse/ParseObjc.cpp | 26 |
1 files changed, 25 insertions, 1 deletions
diff --git a/lib/Parse/ParseObjc.cpp b/lib/Parse/ParseObjc.cpp index 1465a730e4..48c5efac6b 100644 --- a/lib/Parse/ParseObjc.cpp +++ b/lib/Parse/ParseObjc.cpp @@ -18,6 +18,7 @@ #include "clang/Sema/PrettyDeclStackTrace.h" #include "clang/Sema/Scope.h" #include "llvm/ADT/SmallVector.h" +#include "llvm/ADT/StringExtras.h" using namespace clang; @@ -1031,7 +1032,7 @@ Decl *Parser::ParseObjCMethodDecl(SourceLocation mLoc, Scope::FunctionPrototypeScope|Scope::DeclScope); AttributePool allParamAttrs(AttrFactory); - + bool warnSelectorName = false; while (1) { ParsedAttributes paramAttrs(AttrFactory); Sema::ObjCArgInfo ArgInfo; @@ -1102,6 +1103,13 @@ Decl *Parser::ParseObjCMethodDecl(SourceLocation mLoc, SelIdent = ParseObjCSelectorPiece(selLoc); if (!SelIdent && Tok.isNot(tok::colon)) break; + if (MethodDefinition && !SelIdent) { + SourceLocation ColonLoc = Tok.getLocation(); + if (PP.getLocForEndOfToken(ArgInfo.NameLoc) == ColonLoc) { + warnSelectorName = true; + Diag(ArgInfo.NameLoc, diag::missing_selector_name); + } + } // We have a selector or a colon, continue parsing. } @@ -1142,6 +1150,22 @@ Decl *Parser::ParseObjCMethodDecl(SourceLocation mLoc, Selector Sel = PP.getSelectorTable().getSelector(KeyIdents.size(), &KeyIdents[0]); + if (warnSelectorName) { + SmallVector<IdentifierInfo *, 12> DiagKeyIdents; + for (unsigned i = 0, size = KeyIdents.size(); i < size; i++) + if (KeyIdents[i]) + DiagKeyIdents.push_back(KeyIdents[i]); + else { + std::string name = "Name"; + name += llvm::utostr(i+1); + IdentifierInfo *NamedMissingId = &PP.getIdentifierTable().get(name); + DiagKeyIdents.push_back(NamedMissingId); + } + Selector NewSel = + PP.getSelectorTable().getSelector(DiagKeyIdents.size(), &DiagKeyIdents[0]); + Diag(mLoc, diag::note_missing_argument_name) + << NewSel.getAsString() << Sel.getAsString(); + } Decl *Result = Actions.ActOnMethodDeclaration(getCurScope(), mLoc, Tok.getLocation(), mType, DSRet, ReturnType, |