blob: a525615214445a1b2588a97cfa0e79ed42ab6999 [file] [log] [blame]
Fariborz Jahanian20d92292010-07-19 22:02:22 +00001// RUN: %clang_cc1 -fsyntax-only -verify %s
Fariborz Jahanian58677922010-11-09 02:16:57 +00002// rdar://8191774
Fariborz Jahanian20d92292010-07-19 22:02:22 +00003
4@protocol SomeProtocol
5@end
6
7@protocol SomeProtocol1
8@end
9
10@interface SomeObject <SomeProtocol>
11@end
12
13int 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 ||
Stephen Hines651f13c2014-04-23 16:59:28 -070028 classA == classD; // expected-warning {{comparison of distinct pointer types ('Class<SomeProtocol>' and 'Class<SomeProtocol1>')}}
Fariborz Jahanian20d92292010-07-19 22:02:22 +000029}
30
Stephen Hines176edba2014-12-01 14:53:08 -080031// 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