| // RUN: %clang_cc1 -fsyntax-only -verify %s |
| // rdar://9091389 |
| |
| @protocol Fooable |
| - (void)foo; |
| @end |
| |
| @protocol SubFooable <Fooable> |
| @end |
| |
| @interface AClass |
| @end |
| |
| @interface BClass : AClass <SubFooable> |
| @end |
| |
| @implementation BClass |
| - (void)foo { |
| } |
| @end |
| |
| void functionTakingAClassConformingToAProtocol(AClass <Fooable> *instance) { // expected-note {{passing argument to parameter 'instance' here}} |
| } |
| |
| int main () { |
| AClass *aobject = 0; |
| BClass *bobject = 0; |
| functionTakingAClassConformingToAProtocol(aobject); // expected-warning {{incompatible pointer types passing 'AClass *' to parameter of type 'AClass<Fooable> *'}} |
| functionTakingAClassConformingToAProtocol(bobject); // Shouldn't warn - does implement Fooable |
| return 0; |
| } |
| |
| // rdar://9267196 |
| @interface NSObject @end |
| |
| @protocol MyProtocol |
| @end |
| |
| @interface MyClass : NSObject |
| { |
| } |
| @end |
| |
| @implementation MyClass |
| @end |
| |
| @interface MySubclass : MyClass <MyProtocol> |
| { |
| } |
| @end |
| |
| @interface MyTestClass : NSObject |
| { |
| @private |
| NSObject <MyProtocol> *someObj; |
| } |
| |
| @property (nonatomic, assign) NSObject <MyProtocol> *someObj; |
| |
| @end |
| |
| @implementation MyTestClass |
| |
| @synthesize someObj; |
| |
| - (void)someMethod |
| { |
| MySubclass *foo; |
| [self setSomeObj:foo]; // no warning here! |
| } |
| |
| @end |