From: Fariborz Jahanian Date: Tue, 11 Sep 2012 21:27:45 +0000 (+0000) Subject: objective-C: warn if selector has nothing but bare X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=10d65cd8c8974d71ade0f926ab0578fc7dc325e9;p=clang objective-C: warn if selector has nothing but bare ':' in its name. // rdar://8366823 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@163650 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Basic/DiagnosticParseKinds.td b/include/clang/Basic/DiagnosticParseKinds.td index 5f8e8aa3ac..ccdea4aabb 100644 --- a/include/clang/Basic/DiagnosticParseKinds.td +++ b/include/clang/Basic/DiagnosticParseKinds.td @@ -361,6 +361,9 @@ def warn_missing_argument_name : Warning< "no parameter name in the middle of a selector" " may result in incomplete selector name">, InGroup>, DefaultIgnore; +def warn_selector_with_bare_colon : Warning< + "selector has only bare colons in its name">, + InGroup>, DefaultIgnore; def note_missing_argument_name : Note< "did you mean %0 as the selector name">; diff --git a/lib/Parse/ParseObjc.cpp b/lib/Parse/ParseObjc.cpp index 6d5f35a799..2bcb7a786a 100644 --- a/lib/Parse/ParseObjc.cpp +++ b/lib/Parse/ParseObjc.cpp @@ -1032,6 +1032,7 @@ Decl *Parser::ParseObjCMethodDecl(SourceLocation mLoc, AttributePool allParamAttrs(AttrFactory); bool warnSelectorName = false; + bool warnHasNoName = true; while (1) { ParsedAttributes paramAttrs(AttrFactory); Sema::ObjCArgInfo ArgInfo; @@ -1109,7 +1110,8 @@ Decl *Parser::ParseObjCMethodDecl(SourceLocation mLoc, Diag(Tok, diag::warn_missing_argument_name); // missing argument name. warnSelectorName = true; } - + else + warnHasNoName = false; // We have a selector or a colon, continue parsing. } @@ -1150,8 +1152,11 @@ Decl *Parser::ParseObjCMethodDecl(SourceLocation mLoc, Selector Sel = PP.getSelectorTable().getSelector(KeyIdents.size(), &KeyIdents[0]); - if (warnSelectorName) + if (warnSelectorName) { + if (warnHasNoName) + Diag(mLoc, diag::warn_selector_with_bare_colon); Diag(mLoc, diag::note_missing_argument_name) << Sel.getAsString(); + } Decl *Result = Actions.ActOnMethodDeclaration(getCurScope(), mLoc, Tok.getLocation(), diff --git a/test/SemaObjC/warn-missing-selector-arg-name.m b/test/SemaObjC/warn-missing-selector-arg-name.m index 97bcd0db91..3d2a75a1eb 100644 --- a/test/SemaObjC/warn-missing-selector-arg-name.m +++ b/test/SemaObjC/warn-missing-selector-arg-name.m @@ -1,11 +1,15 @@ -// 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 +// RUN: %clang_cc1 -fsyntax-only -verify -Wselector-with-bare-colons -Wmissing-argument-name-in-selector %s +// RUN: %clang_cc1 -x objective-c++ -fsyntax-only -verify -Wselector-with-bare-colons -Wmissing-argument-name-in-selector %s +// rdar://8366823 // rdar://12263549 @interface Super @end @interface INTF : Super +- (void) MMM; +- (void)bar:(id)b; -(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-warning {{selector has only bare colons in its 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}} \ @@ -13,8 +17,11 @@ @end @implementation INTF +- (void) MMM{} +- (void)bar:(id)b{} -(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-warning {{selector has only bare colons in its 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}} \