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