| // RUN: %clang_cc1 -fsyntax-only -Wselector -verify -Wno-objc-root-class %s |
| // rdar://8851684 |
| |
| @interface Foo |
| - (void) foo; |
| - (void) bar; |
| @end |
| |
| @implementation Foo |
| - (void) bar |
| { |
| } |
| |
| - (void) foo |
| { |
| SEL a,b,c; |
| a = @selector(b1ar); |
| b = @selector(bar); |
| } |
| @end |
| |
| @interface I |
| - length; |
| @end |
| |
| SEL func() |
| { |
| return @selector(length); // expected-warning {{no method with selector 'length' is implemented in this translation unit}} |
| } |
| |
| // rdar://9545564 |
| @class MSPauseManager; |
| |
| @protocol MSPauseManagerDelegate |
| @optional |
| - (void)pauseManagerDidPause:(MSPauseManager *)manager; |
| - (int)respondsToSelector:(SEL)aSelector; |
| @end |
| |
| @interface MSPauseManager |
| { |
| id<MSPauseManagerDelegate> _delegate; |
| } |
| @end |
| |
| |
| @implementation MSPauseManager |
| - (id) Meth { |
| if ([_delegate respondsToSelector:@selector(pauseManagerDidPause:)]) |
| return 0; |
| return 0; |
| } |
| @end |
| |
| // rdar://12938616 |
| @class NSXPCConnection; |
| |
| @interface NSObject |
| @end |
| |
| @interface INTF : NSObject |
| { |
| NSXPCConnection *cnx; // Comes in as a parameter. |
| } |
| - (void) Meth; |
| @end |
| |
| extern SEL MySelector(SEL s); |
| |
| @implementation INTF |
| - (void) Meth { |
| if( [cnx respondsToSelector:MySelector(@selector( _setQueue: ))] ) |
| { |
| } |
| |
| if( [cnx respondsToSelector:@selector( _setQueueXX: )] ) // No warning here. |
| { |
| } |
| if( [cnx respondsToSelector:(@selector( _setQueueXX: ))] ) // No warning here. |
| { |
| } |
| } |
| @end |
| |
| // rdar://14007194 |
| @interface UxTechTest : NSObject |
| - (int) invalidate : (id)Arg; |
| + (int) C_invalidate : (int)arg; |
| @end |
| |
| @interface UxTechTest(CAT) |
| - (char) invalidate : (int)arg; |
| + (int) C_invalidate : (char)arg; |
| @end |
| |
| @interface NSPort : NSObject |
| - (double) invalidate : (void*)Arg1; |
| + (int) C_invalidate : (id*)arg; |
| @end |
| |
| |
| @interface USEText : NSPort |
| - (int) invalidate : (int)arg; |
| @end |
| |
| @implementation USEText |
| - (int) invalidate :(int) arg { return 0; } |
| @end |
| |
| @interface USETextSub : USEText |
| - (int) invalidate : (id)arg; |
| @end |
| |
| // rdar://16428638 |
| @interface I16428638 |
| - (int) compare: (I16428638 *) arg1; // commenting out this line avoids the warning |
| @end |
| |
| @interface J16428638 |
| - (int) compare: (J16428638 *) arg1; |
| @end |
| |
| @implementation J16428638 |
| - (void)method { |
| SEL s = @selector(compare:); // spurious warning |
| (void)s; |
| } |
| - (int) compare: (J16428638 *) arg1 { |
| return 0; |
| } |
| @end |
| |
| void test16428638() { |
| SEL s = @selector(compare:); |
| (void)s; |
| } |
| |
| // rdar://16607480 |
| @class NSString; |
| @interface SELCanary : NSObject |
| @property (readonly, nonatomic) NSString *name; |
| @property (nonatomic, getter = isHidden) char hidden; |
| @property (nonatomic, copy, getter = hasFish, setter = setFish:) NSString *ridiculousFish; |
| @end |
| |
| @implementation SELCanary |
| - (void) Meth { |
| SEL properties[] = { |
| @selector(name), |
| @selector(isHidden), |
| @selector(setHidden:), |
| @selector(hasFish), |
| @selector(setFish:) |
| }; |
| } |
| @end |
| |