1*67e74705SXin Li// RUN: %clang_cc1 -fsyntax-only -verify %s 2*67e74705SXin Li// rdar://8191774 3*67e74705SXin Li 4*67e74705SXin Li@protocol SomeProtocol 5*67e74705SXin Li@end 6*67e74705SXin Li 7*67e74705SXin Li@protocol SomeProtocol1 8*67e74705SXin Li@end 9*67e74705SXin Li 10*67e74705SXin Li@interface SomeObject <SomeProtocol> 11*67e74705SXin Li@end 12*67e74705SXin Li 13*67e74705SXin Liint main () { 14*67e74705SXin Li Class <SomeProtocol> classA; 15*67e74705SXin Li Class <SomeProtocol> classB; 16*67e74705SXin Li Class <SomeProtocol, SomeProtocol1> classC; 17*67e74705SXin Li Class <SomeProtocol1> classD; 18*67e74705SXin Li void * pv = 0; 19*67e74705SXin Li Class c = (Class)0;; 20*67e74705SXin Li if (pv) 21*67e74705SXin Li return classA == pv; 22*67e74705SXin Li 23*67e74705SXin Li if (c) 24*67e74705SXin Li return classA == c; 25*67e74705SXin Li 26*67e74705SXin Li return classA == classB || classA == classC || 27*67e74705SXin Li classC == classA || 28*67e74705SXin Li classA == classD; // expected-warning {{comparison of distinct pointer types ('Class<SomeProtocol>' and 'Class<SomeProtocol1>')}} 29*67e74705SXin Li} 30*67e74705SXin Li 31*67e74705SXin Li// rdar://18491222 32*67e74705SXin Li@protocol NSObject @end 33*67e74705SXin Li 34*67e74705SXin Li@interface NSObject @end 35*67e74705SXin Li@protocol ProtocolX <NSObject> 36*67e74705SXin Li@end 37*67e74705SXin Li 38*67e74705SXin Li@protocol ProtocolY <NSObject> 39*67e74705SXin Li@end 40*67e74705SXin Li 41*67e74705SXin Li@interface ClassA : NSObject 42*67e74705SXin Li@end 43*67e74705SXin Li 44*67e74705SXin Li@interface ClassB : ClassA <ProtocolY, ProtocolX> 45*67e74705SXin Li@end 46*67e74705SXin Li 47*67e74705SXin Li@interface OtherClass : NSObject 48*67e74705SXin Li@property (nonatomic, copy) ClassB<ProtocolX> *aProperty; 49*67e74705SXin Li- (ClassA<ProtocolY> *)aMethod; 50*67e74705SXin Li- (ClassA<ProtocolY> *)anotherMethod; 51*67e74705SXin Li@end 52*67e74705SXin Li 53*67e74705SXin Li@implementation OtherClass 54*67e74705SXin Li- (ClassA<ProtocolY> *)aMethod { 55*67e74705SXin Li // This does not work, even though ClassB subclasses from A and conforms to Y 56*67e74705SXin Li // because the property type explicity adds ProtocolX conformance 57*67e74705SXin Li // even though ClassB already conforms to ProtocolX 58*67e74705SXin Li return self.aProperty; 59*67e74705SXin Li} 60*67e74705SXin Li- (ClassA<ProtocolY> *)anotherMethod { 61*67e74705SXin Li // This works, even though all it is doing is removing an explicit 62*67e74705SXin Li // protocol conformance that ClassB already conforms to 63*67e74705SXin Li return (ClassB *)self.aProperty; 64*67e74705SXin Li} 65*67e74705SXin Li@end 66