1*67e74705SXin Li// RUN: %clang_cc1 -fsyntax-only -verify %s 2*67e74705SXin Li// rdar://9091389 3*67e74705SXin Li 4*67e74705SXin Li@protocol Fooable 5*67e74705SXin Li- (void)foo; 6*67e74705SXin Li@end 7*67e74705SXin Li 8*67e74705SXin Li@protocol SubFooable <Fooable> 9*67e74705SXin Li@end 10*67e74705SXin Li 11*67e74705SXin Li@interface AClass 12*67e74705SXin Li@end 13*67e74705SXin Li 14*67e74705SXin Li@interface BClass : AClass <SubFooable> 15*67e74705SXin Li@end 16*67e74705SXin Li 17*67e74705SXin Li@implementation BClass 18*67e74705SXin Li- (void)foo { 19*67e74705SXin Li} 20*67e74705SXin Li@end 21*67e74705SXin Li 22*67e74705SXin Livoid functionTakingAClassConformingToAProtocol(AClass <Fooable> *instance) { // expected-note {{passing argument to parameter 'instance' here}} 23*67e74705SXin Li} 24*67e74705SXin Li 25*67e74705SXin Liint main () { 26*67e74705SXin Li AClass *aobject = 0; 27*67e74705SXin Li BClass *bobject = 0; 28*67e74705SXin Li functionTakingAClassConformingToAProtocol(aobject); // expected-warning {{incompatible pointer types passing 'AClass *' to parameter of type 'AClass<Fooable> *'}} 29*67e74705SXin Li functionTakingAClassConformingToAProtocol(bobject); // Shouldn't warn - does implement Fooable 30*67e74705SXin Li return 0; 31*67e74705SXin Li} 32*67e74705SXin Li 33*67e74705SXin Li// rdar://9267196 34*67e74705SXin Li@interface NSObject @end 35*67e74705SXin Li 36*67e74705SXin Li@protocol MyProtocol 37*67e74705SXin Li@end 38*67e74705SXin Li 39*67e74705SXin Li@interface MyClass : NSObject 40*67e74705SXin Li{ 41*67e74705SXin Li} 42*67e74705SXin Li@end 43*67e74705SXin Li 44*67e74705SXin Li@implementation MyClass 45*67e74705SXin Li@end 46*67e74705SXin Li 47*67e74705SXin Li@interface MySubclass : MyClass <MyProtocol> 48*67e74705SXin Li{ 49*67e74705SXin Li} 50*67e74705SXin Li@end 51*67e74705SXin Li 52*67e74705SXin Li@interface MyTestClass : NSObject 53*67e74705SXin Li{ 54*67e74705SXin Li@private 55*67e74705SXin Li NSObject <MyProtocol> *someObj; 56*67e74705SXin Li} 57*67e74705SXin Li 58*67e74705SXin Li@property (nonatomic, assign) NSObject <MyProtocol> *someObj; 59*67e74705SXin Li 60*67e74705SXin Li@end 61*67e74705SXin Li 62*67e74705SXin Li@implementation MyTestClass 63*67e74705SXin Li 64*67e74705SXin Li@synthesize someObj; 65*67e74705SXin Li 66*67e74705SXin Li- (void)someMethod 67*67e74705SXin Li{ 68*67e74705SXin Li MySubclass *foo; 69*67e74705SXin Li [self setSomeObj:foo]; // no warning here! 70*67e74705SXin Li} 71*67e74705SXin Li 72*67e74705SXin Li@end 73