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