// RUN: %clang_cc1 -fsyntax-only -verify %s // rdar://8191774 @protocol SomeProtocol @end @protocol SomeProtocol1 @end @interface SomeObject @end int main () { Class classA; Class classB; Class classC; Class 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' and 'Class')}} } // rdar://18491222 @protocol NSObject @end @interface NSObject @end @protocol ProtocolX @end @protocol ProtocolY @end @interface ClassA : NSObject @end @interface ClassB : ClassA @end @interface OtherClass : NSObject @property (nonatomic, copy) ClassB *aProperty; - (ClassA *)aMethod; - (ClassA *)anotherMethod; @end @implementation OtherClass - (ClassA *)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 *)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