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

Reply via email to