|  | // RUN: %clang_cc1 -fsyntax-only -verify %s | 
|  | // rdar://8191774 | 
|  |  | 
|  | @protocol SomeProtocol | 
|  | @end | 
|  |  | 
|  | @protocol SomeProtocol1 | 
|  | @end | 
|  |  | 
|  | @interface SomeObject <SomeProtocol> | 
|  | @end | 
|  |  | 
|  | int main () { | 
|  | Class <SomeProtocol> classA; | 
|  | Class <SomeProtocol> classB; | 
|  | Class <SomeProtocol, SomeProtocol1> classC; | 
|  | Class <SomeProtocol1> classD; | 
|  | void * pv = 0; | 
|  | Class c = (Class)0;; | 
|  | if (pv) | 
|  | return classA == pv; | 
|  |  | 
|  | if (c) | 
|  | return classA == c; | 
|  |  | 
|  | return classA == classB  || classA == classC || | 
|  | classC == classA || | 
|  | classA == classD; // expected-warning {{comparison of distinct pointer types ('Class<SomeProtocol>' and 'Class<SomeProtocol1>')}} | 
|  | } | 
|  |  | 
|  | // rdar://18491222 | 
|  | @protocol NSObject @end | 
|  |  | 
|  | @interface NSObject @end | 
|  | @protocol ProtocolX <NSObject> | 
|  | @end | 
|  |  | 
|  | @protocol ProtocolY <NSObject> | 
|  | @end | 
|  |  | 
|  | @interface ClassA : NSObject | 
|  | @end | 
|  |  | 
|  | @interface ClassB : ClassA <ProtocolY, ProtocolX> | 
|  | @end | 
|  |  | 
|  | @interface OtherClass : NSObject | 
|  | @property (nonatomic, copy) ClassB<ProtocolX> *aProperty; | 
|  | - (ClassA<ProtocolY> *)aMethod; | 
|  | - (ClassA<ProtocolY> *)anotherMethod; | 
|  | @end | 
|  |  | 
|  | @implementation OtherClass | 
|  | - (ClassA<ProtocolY> *)aMethod { | 
|  | // This does not work, even though ClassB subclasses from A and conforms to Y | 
|  | // because the property type explicity adds ProtocolX conformance | 
|  | // even though ClassB already conforms to ProtocolX | 
|  | return self.aProperty; | 
|  | } | 
|  | - (ClassA<ProtocolY> *)anotherMethod { | 
|  | // This works, even though all it is doing is removing an explicit | 
|  | // protocol conformance that ClassB already conforms to | 
|  | return (ClassB *)self.aProperty; | 
|  | } | 
|  | @end |