mirror of
https://github.com/Gericom/teak-llvm.git
synced 2025-06-19 11:35:51 -04:00

instance of a qualified Class object when that instance method comes from a protocol that's implemented by NSObject Instance methods from a root class like NSObject are also class methods because the metaclass of root class derives from that root class. Therefore, we can avoid the warning for instances of qualified Class objects that point to classes that derive from NSObject. Note that we actually don't know if a Class instance points to a class that derives from NSObject at compile-time, so we have to make a reasonable assumption that the majority of instances will do so. rdar://22812517 llvm-svn: 297862
62 lines
1.6 KiB
Objective-C
62 lines
1.6 KiB
Objective-C
// RUN: %clang_cc1 -fsyntax-only -verify -Wno-objc-root-class %s
|
|
// rdar://9224670
|
|
|
|
@interface RandomObject {
|
|
@private
|
|
}
|
|
+ (id)alloc;
|
|
@end
|
|
|
|
@protocol TestProtocol
|
|
- (void)nothingInteresting;
|
|
@end
|
|
|
|
@protocol Test2Protocol
|
|
+ (id)alloc;
|
|
- (id)alloc2; // expected-note 2 {{method 'alloc2' declared here}}
|
|
@end
|
|
|
|
@implementation RandomObject
|
|
- (void) Meth {
|
|
Class<TestProtocol> c = [c alloc]; // expected-warning {{class method '+alloc' not found (return type defaults to 'id')}}
|
|
Class<Test2Protocol> c1 = [c1 alloc2]; // expected-warning {{instance method 'alloc2' found instead of class method 'alloc2'}}
|
|
Class<Test2Protocol> c2 = [c2 alloc]; // ok
|
|
}
|
|
+ (id)alloc { return 0; }
|
|
@end
|
|
|
|
int main ()
|
|
{
|
|
Class<TestProtocol> c = [c alloc]; // expected-warning {{class method '+alloc' not found (return type defaults to 'id')}}
|
|
Class<Test2Protocol> c1 = [c1 alloc2]; // expected-warning {{instance method 'alloc2' found instead of class method 'alloc2'}}
|
|
Class<Test2Protocol> c2 = [c2 alloc]; // ok
|
|
return 0;
|
|
}
|
|
|
|
// rdar://22812517
|
|
|
|
@protocol NSObject
|
|
|
|
- (int)respondsToSelector:(SEL)aSelector;
|
|
|
|
@end
|
|
|
|
__attribute__((objc_root_class))
|
|
@interface NSObject <NSObject>
|
|
|
|
@end
|
|
|
|
@protocol OtherProto
|
|
|
|
- (void)otherInstanceMethod; // expected-note {{method 'otherInstanceMethod' declared here}}
|
|
|
|
@end
|
|
|
|
@protocol MyProto <NSObject, OtherProto>
|
|
@end
|
|
|
|
void allowInstanceMethodsFromRootProtocols(Class<MyProto> c) {
|
|
[c respondsToSelector: @selector(instanceMethod)]; // no warning
|
|
[c otherInstanceMethod]; // expected-warning {{instance method 'otherInstanceMethod' found instead of class method 'otherInstanceMethod'}}
|
|
}
|