diff options
author | Fariborz Jahanian <fjahanian@apple.com> | 2012-09-11 17:24:26 +0000 |
---|---|---|
committer | Fariborz Jahanian <fjahanian@apple.com> | 2012-09-11 17:24:26 +0000 |
commit | 92faee71f4fa01565c1c1eab617e936a01d56276 (patch) | |
tree | f4df3a22331803252a9e3d05c13958f57a084fd8 | |
parent | c6baadceec1d5148c20ee6c902a102233c547f62 (diff) |
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
-rw-r--r-- | include/clang/Basic/DiagnosticParseKinds.td | 6 | ||||
-rw-r--r-- | lib/Parse/ParseObjc.cpp | 17 | ||||
-rw-r--r-- | test/SemaObjC/warn-missing-selector-arg-name.m | 22 |
3 files changed, 42 insertions, 3 deletions
diff --git a/include/clang/Basic/DiagnosticParseKinds.td b/include/clang/Basic/DiagnosticParseKinds.td index e4e339aefc..5f8e8aa3ac 100644 --- a/include/clang/Basic/DiagnosticParseKinds.td +++ b/include/clang/Basic/DiagnosticParseKinds.td @@ -357,6 +357,12 @@ def err_nsnumber_nonliteral_unary : Error< def warn_cstyle_param : Warning< "use of C-style parameters in Objective-C method declarations" " is deprecated">, InGroup<DeprecatedDeclarations>; +def warn_missing_argument_name : Warning< + "no parameter name in the middle of a selector" + " may result in incomplete selector name">, + InGroup<DiagGroup<"missing-argument-name-in-selector">>, DefaultIgnore; +def note_missing_argument_name : Note< + "did you mean %0 as the selector name">; let CategoryName = "ARC Parse Issue" in { def err_arc_bridge_retain : Error< diff --git a/lib/Parse/ParseObjc.cpp b/lib/Parse/ParseObjc.cpp index 977d4d9734..6d5f35a799 100644 --- a/lib/Parse/ParseObjc.cpp +++ b/lib/Parse/ParseObjc.cpp @@ -1031,7 +1031,7 @@ Decl *Parser::ParseObjCMethodDecl(SourceLocation mLoc, Scope::FunctionPrototypeScope|Scope::DeclScope); AttributePool allParamAttrs(AttrFactory); - + bool warnSelectorName = false; while (1) { ParsedAttributes paramAttrs(AttrFactory); Sema::ObjCArgInfo ArgInfo; @@ -1100,8 +1100,16 @@ Decl *Parser::ParseObjCMethodDecl(SourceLocation mLoc, // 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 @@ Decl *Parser::ParseObjCMethodDecl(SourceLocation mLoc, 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, diff --git a/test/SemaObjC/warn-missing-selector-arg-name.m b/test/SemaObjC/warn-missing-selector-arg-name.m new file mode 100644 index 0000000000..97bcd0db91 --- /dev/null +++ b/test/SemaObjC/warn-missing-selector-arg-name.m @@ -0,0 +1,22 @@ +// RUN: %clang_cc1 -fsyntax-only -verify -Wno-objc-root-class -Wmissing-argument-name-in-selector %s +// RUN: %clang_cc1 -x objective-c++ -fsyntax-only -verify -Wno-objc-root-class -Wmissing-argument-name-in-selector %s +// rdar://12263549 + +@interface Super @end +@interface INTF : Super +-(void) Name1:(id)Arg1 Name2:(id)Arg2; // Name1:Name2: +-(void) Name1:(id) Name2:(id)Arg2; // expected-warning {{no parameter name in the middle of a selector may result in incomplete selector name}} \ + // expected-note {{did you mean Name1:: as the selector name}} +-(void) Name1:(id)Arg1 Name2:(id)Arg2 Name3:(id)Arg3; // Name1:Name2:Name3: +-(void) Name1:(id)Arg1 Name2:(id) Name3:(id)Arg3; // expected-warning {{no parameter name in the middle of a selector may result in incomplete selector name}} \ + // expected-note {{did you mean Name1:Name2:: as the selector name}} +@end + +@implementation INTF +-(void) Name1:(id)Arg1 Name2:(id)Arg2{} +-(void) Name1:(id) Name2:(id)Arg2 {} // expected-warning {{no parameter name in the middle of a selector may result in incomplete selector name}} \ + // expected-note {{did you mean Name1:: as the selector name}} +-(void) Name1:(id)Arg1 Name2:(id)Arg2 Name3:(id)Arg3 {} +-(void) Name1:(id)Arg1 Name2:(id) Name3:(id)Arg3 {} // expected-warning {{no parameter name in the middle of a selector may result in incomplete selector name}} \ + // expected-note {{did you mean Name1:Name2:: as the selector name}} +@end |