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