73 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Objective-C
		
	
	
	
			
		
		
	
	
			73 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Objective-C
		
	
	
	
| // 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
 |