Currently, we only note two methods in the warning. It can be improved to note all methods. - Fariborz
On Mar 26, 2014, at 9:40 PM, Nico Weber <[email protected]> wrote: > And a second question: In this example, clang only prints the save: calls in > system headers but not the one in the interface that's actually the one that > will be called at runtime: > > Nicos-MacBook-Pro:src thakis$ cat test.mm > #import <Cocoa/Cocoa.h> > > @interface WindowSizeAutosaver : NSObject > @end > > @interface WindowSizeAutosaver (Private) > - (void)save:(NSNotification*)notification; > @end > > @implementation WindowSizeAutosaver > - (id)initWithWindow:(NSWindow*)window > path:(const char*)path { > if ((self = [super init])) { > [[NSNotificationCenter defaultCenter] > addObserver:self > selector:@selector(save:) > name:NSWindowDidMoveNotification > object:window]; > } > return self; > } > @end > Nicos-MacBook-Pro:src thakis$ ~/src/llvm-build/bin/clang -c test.mm -Wall > -isysroot > /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk > > test.mm:16:19: warning: several methods with selector 'save:' of mismatched > types are found for the @selector expression [-Wselector-type-mismatch] > selector:@selector(save:) > ^ > /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk/System/Library/Frameworks/AppKit.framework/Headers/NSUserDefaultsController.h:43:1: > note: method 'save:' declared here > - (void)save:(id)sender; // no effect if applies immediately > ^ > /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk/System/Library/Frameworks/CoreData.framework/Headers/NSManagedObjectContext.h:185:1: > note: method 'save:' declared here > - (BOOL)save:(NSError **)error; > ^ > 1 warning generated. > > > On Wed, Mar 26, 2014 at 9:22 PM, Nico Weber <[email protected]> wrote: > Hi, > > how does one fix this warning? I have this code: > > NSString* string = @""; > [NSThread detachNewThreadSelector:@selector(length) > toTarget:string > withObject:nil]; > > > clang now warns: > > ../../content/renderer/renderer_main_platform_delegate_mac.mm:122:39: error: > several methods with selector 'length' of mismatched types are found for the > @selector expression [-Werror,-Wselector-type-mismatch] > [NSThread detachNewThreadSelector:@selector(length) > ^ > /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSString.h:78:1: > note: method 'length' declared here > - (NSUInteger)length; > ^ > /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk/System/Library/Frameworks/AppKit.framework/Headers/NSStatusItem.h:45:1: > note: method 'length' declared here > - (CGFloat)length; > ^ > > What am I supposed to do about this? > > > > On Wed, Mar 12, 2014 at 11:34 AM, Fariborz Jahanian <[email protected]> > wrote: > Author: fjahanian > Date: Wed Mar 12 13:34:01 2014 > New Revision: 203693 > > URL: http://llvm.org/viewvc/llvm-project?rev=203693&view=rev > Log: > Objective-C. Issue diagnostics on mismatched methods when their selector is > used > in an @selector expression. // rdar://15794055 > > Modified: > cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td > cfe/trunk/lib/Sema/SemaExprObjC.cpp > cfe/trunk/test/SemaObjC/selector-1.m > > Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=203693&r1=203692&r2=203693&view=diff > ============================================================================== > --- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original) > +++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Wed Mar 12 13:34:01 > 2014 > @@ -892,7 +892,9 @@ def warn_unimplemented_selector: Warnin > InGroup<Selector>, DefaultIgnore; > def warn_unimplemented_protocol_method : Warning< > "method %0 in protocol %1 not implemented">, InGroup<Protocol>; > - > +def warning_multiple_selectors: Warning< > + "several methods with selector %0 of mismatched types are found for the > @selector expression">, > + InGroup<SelectorTypeMismatch>; > // C++ declarations > def err_static_assert_expression_is_not_constant : Error< > "static_assert expression is not an integral constant expression">; > > Modified: cfe/trunk/lib/Sema/SemaExprObjC.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExprObjC.cpp?rev=203693&r1=203692&r2=203693&view=diff > ============================================================================== > --- cfe/trunk/lib/Sema/SemaExprObjC.cpp (original) > +++ cfe/trunk/lib/Sema/SemaExprObjC.cpp Wed Mar 12 13:34:01 2014 > @@ -973,6 +973,58 @@ ExprResult Sema::ParseObjCEncodeExpressi > return BuildObjCEncodeExpression(AtLoc, TInfo, RParenLoc); > } > > +static bool HelperToDiagnoseMismatchedMethodsInGlobalPool(Sema &S, > + SourceLocation AtLoc, > + ObjCMethodDecl *Method, > + ObjCMethodList &MethList) { > + ObjCMethodList *M = &MethList; > + bool Warned = false; > + for (M = M->getNext(); M; M=M->getNext()) { > + ObjCMethodDecl *MatchingMethodDecl = M->Method; > + if (MatchingMethodDecl == Method || > + isa<ObjCImplDecl>(MatchingMethodDecl->getDeclContext()) || > + MatchingMethodDecl->getSelector() != Method->getSelector()) > + continue; > + if (!S.MatchTwoMethodDeclarations(Method, > + MatchingMethodDecl, Sema::MMS_loose)) { > + if (!Warned) { > + Warned = true; > + S.Diag(AtLoc, diag::warning_multiple_selectors) > + << Method->getSelector(); > + S.Diag(Method->getLocation(), diag::note_method_declared_at) > + << Method->getDeclName(); > + } > + S.Diag(MatchingMethodDecl->getLocation(), > diag::note_method_declared_at) > + << MatchingMethodDecl->getDeclName(); > + } > + } > + return Warned; > +} > + > +static void DiagnoseMismatchedSelectors(Sema &S, SourceLocation AtLoc, > + ObjCMethodDecl *Method) { > + unsigned DIAG = diag::warning_multiple_selectors; > + if (S.Diags.getDiagnosticLevel(DIAG, SourceLocation()) > + == DiagnosticsEngine::Ignored) > + return; > + bool Warned = false; > + for (Sema::GlobalMethodPool::iterator b = S.MethodPool.begin(), > + e = S.MethodPool.end(); b != e; b++) { > + // first, instance methods > + ObjCMethodList &InstMethList = b->second.first; > + if (HelperToDiagnoseMismatchedMethodsInGlobalPool(S, AtLoc, > + Method, InstMethList)) > + Warned = true; > + > + // second, class methods > + ObjCMethodList &ClsMethList = b->second.second; > + if (HelperToDiagnoseMismatchedMethodsInGlobalPool(S, AtLoc, > + Method, ClsMethList) || > + Warned) > + return; > + } > +} > + > ExprResult Sema::ParseObjCSelectorExpression(Selector Sel, > SourceLocation AtLoc, > SourceLocation SelLoc, > @@ -994,7 +1046,8 @@ ExprResult Sema::ParseObjCSelectorExpres > > } else > Diag(SelLoc, diag::warn_undeclared_selector) << Sel; > - } > + } else > + DiagnoseMismatchedSelectors(*this, AtLoc, Method); > > if (!Method || > Method->getImplementationControl() != ObjCMethodDecl::Optional) { > > Modified: cfe/trunk/test/SemaObjC/selector-1.m > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaObjC/selector-1.m?rev=203693&r1=203692&r2=203693&view=diff > ============================================================================== > --- cfe/trunk/test/SemaObjC/selector-1.m (original) > +++ cfe/trunk/test/SemaObjC/selector-1.m Wed Mar 12 13:34:01 2014 > @@ -1,18 +1,17 @@ > // RUN: %clang_cc1 -verify %s > -// expected-no-diagnostics > > @interface I > -- (id) compare: (char) arg1; > +- (id) compare: (char) arg1; // expected-note {{method 'compare:' declared > here}} > - length; > @end > > @interface J > -- (id) compare: (id) arg1; > +- (id) compare: (id) arg1; // expected-note {{method 'compare:' declared > here}} > @end > > SEL func() > { > - return @selector(compare:); // no warning on multiple selector > found. > + return @selector(compare:); // expected-warning {{several methods > with selector 'compare:' of mismatched types are found for the @selector > expression}} > } > > int main() { > @@ -27,3 +26,26 @@ int main() { > > SEL s9 = @selector(:enum:bool:); > } > + > +// rdar://15794055 > +@interface NSObject @end > + > +@class NSNumber; > + > +@interface XBRecipe : NSObject > +@property (nonatomic, assign) float finalVolume; // expected-note {{method > 'setFinalVolume:' declared here}} > +@end > + > +@interface XBDocument : NSObject > +@end > + > +@interface XBDocument () > +- (void)setFinalVolume:(NSNumber *)finalVolumeNumber; // expected-note > {{method 'setFinalVolume:' declared here}} > +@end > + > +@implementation XBDocument > +- (void)setFinalVolume:(NSNumber *)finalVolumeNumber > +{ > + (void)@selector(setFinalVolume:); // expected-warning {{several methods > with selector 'setFinalVolume:' of mismatched types are found for the > @selector expression}} > +} > +@end > > > _______________________________________________ > cfe-commits mailing list > [email protected] > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits > >
_______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
