On Mar 27, 2014, at 10:01 AM, Nico Weber <[email protected]> wrote: > Isn't a warning where the suggested fix is "turn off the warning" kind of > pointless?
There are cases that this warning could be false positive. And there are cases that it points to unexpected runtime behavior. I think the test below is one of them. But, this warning should be opted in. Currently, it is on by default. I will make the change so it is only opted in. - Fariborz > > > On Thu, Mar 27, 2014 at 9:55 AM, jahanian <[email protected]> wrote: > 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
