| // 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 explicitly 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 |