
To make kindof lookup work, we need to insert methods with different context into the global pool, even though they have the same siganture. Since diagnosis of availability is performed on the best candidate, which is often the first candidate from the global pool, we prioritize the methods that are unavaible or deprecated to the head of the list. Since we now have more methods in the global pool, we need to watch out for performance impact. rdar://25635831 llvm-svn: 265877
101 lines
2.3 KiB
Objective-C
101 lines
2.3 KiB
Objective-C
// RUN: %clang_cc1 -Wstrict-selector-match -fsyntax-only -verify %s
|
|
|
|
@interface Foo
|
|
-(int) method; // expected-note {{using}}
|
|
@end
|
|
|
|
@interface Bar
|
|
-(float) method; // expected-note {{also found}}
|
|
@end
|
|
|
|
int main() { [(id)0 method]; } // expected-warning {{multiple methods named 'method' found}}
|
|
|
|
@interface Object @end
|
|
|
|
@interface Class1
|
|
- (void)setWindow:(Object *)wdw; // expected-note 2 {{using}}
|
|
@end
|
|
|
|
@interface Class2
|
|
- (void)setWindow:(Class1 *)window; // expected-note 2 {{also found}}
|
|
@end
|
|
|
|
id foo(void) {
|
|
Object *obj = 0;
|
|
id obj2 = obj;
|
|
[obj setWindow:0]; // expected-warning {{Object' may not respond to 'setWindow:'}} \
|
|
// expected-warning {{multiple methods named 'setWindow:' found}}
|
|
[obj2 setWindow:0]; // expected-warning {{multiple methods named 'setWindow:' found}}
|
|
return obj;
|
|
}
|
|
|
|
@protocol MyObject
|
|
- (id)initWithData:(Object *)data; // expected-note {{also found}}
|
|
@end
|
|
|
|
@protocol SomeOther
|
|
- (id)initWithData:(int)data; // expected-note {{also found}}
|
|
@end
|
|
|
|
@protocol MyCoding
|
|
- (id)initWithData:(id<MyObject, MyCoding>)data; // expected-note {{using}}
|
|
@end
|
|
|
|
@interface NTGridDataObject: Object <MyCoding>
|
|
{
|
|
Object<MyCoding> *_data;
|
|
}
|
|
+ (NTGridDataObject*)dataObject:(id<MyObject, MyCoding>)data;
|
|
@end
|
|
|
|
@implementation NTGridDataObject
|
|
- (id)initWithData:(id<MyObject, MyCoding>)data { // expected-note {{also found}}
|
|
return data;
|
|
}
|
|
+ (NTGridDataObject*)dataObject:(id<MyObject, MyCoding>)data
|
|
{
|
|
NTGridDataObject *result = [(id)0 initWithData:data]; // expected-warning {{multiple methods named 'initWithData:' found}}
|
|
return result;
|
|
}
|
|
@end
|
|
|
|
@interface Base
|
|
- (unsigned)port;
|
|
@end
|
|
|
|
@interface Derived: Base
|
|
- (Object *)port;
|
|
+ (Protocol *)port;
|
|
@end
|
|
|
|
void foo1(void) {
|
|
[(Class)0 port]; // OK - gcc issues warning but there is only one Class method so no ambiguity to warn
|
|
}
|
|
|
|
// rdar://19265430
|
|
@interface NSObject
|
|
- (id)class;
|
|
- (id) alloc;
|
|
@end
|
|
|
|
@class NSString;
|
|
|
|
@interface A : NSObject
|
|
- (instancetype)initWithType:(NSString *)whatever; // expected-note {{also found}}
|
|
@end
|
|
|
|
@interface Test : NSObject
|
|
@end
|
|
|
|
@implementation Test
|
|
+ (instancetype)foo
|
|
{
|
|
return [[[self class] alloc] initWithType:3]; // expected-warning {{multiple methods named 'initWithType:'}}
|
|
}
|
|
|
|
- (instancetype)initWithType:(unsigned int)whatever // expected-note {{using}}
|
|
{
|
|
return 0;
|
|
}
|
|
@end
|