xref: /aosp_15_r20/external/clang/test/SemaObjC/unqualified-to-qualified-class-warn.m (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li// RUN: %clang_cc1  -fsyntax-only -verify %s
2*67e74705SXin Li// rdar://9091389
3*67e74705SXin Li
4*67e74705SXin Li@protocol Fooable
5*67e74705SXin Li- (void)foo;
6*67e74705SXin Li@end
7*67e74705SXin Li
8*67e74705SXin Li@protocol SubFooable <Fooable>
9*67e74705SXin Li@end
10*67e74705SXin Li
11*67e74705SXin Li@interface AClass
12*67e74705SXin Li@end
13*67e74705SXin Li
14*67e74705SXin Li@interface BClass : AClass <SubFooable>
15*67e74705SXin Li@end
16*67e74705SXin Li
17*67e74705SXin Li@implementation BClass
18*67e74705SXin Li- (void)foo {
19*67e74705SXin Li}
20*67e74705SXin Li@end
21*67e74705SXin Li
22*67e74705SXin Livoid functionTakingAClassConformingToAProtocol(AClass <Fooable> *instance) { // expected-note {{passing argument to parameter 'instance' here}}
23*67e74705SXin Li}
24*67e74705SXin Li
25*67e74705SXin Liint main () {
26*67e74705SXin Li    AClass *aobject = 0;
27*67e74705SXin Li    BClass *bobject = 0;
28*67e74705SXin Li    functionTakingAClassConformingToAProtocol(aobject);  // expected-warning {{incompatible pointer types passing 'AClass *' to parameter of type 'AClass<Fooable> *'}}
29*67e74705SXin Li    functionTakingAClassConformingToAProtocol(bobject); // Shouldn't warn -  does implement Fooable
30*67e74705SXin Li    return 0;
31*67e74705SXin Li}
32*67e74705SXin Li
33*67e74705SXin Li// rdar://9267196
34*67e74705SXin Li@interface NSObject @end
35*67e74705SXin Li
36*67e74705SXin Li@protocol MyProtocol
37*67e74705SXin Li@end
38*67e74705SXin Li
39*67e74705SXin Li@interface MyClass : NSObject
40*67e74705SXin Li{
41*67e74705SXin Li}
42*67e74705SXin Li@end
43*67e74705SXin Li
44*67e74705SXin Li@implementation MyClass
45*67e74705SXin Li@end
46*67e74705SXin Li
47*67e74705SXin Li@interface MySubclass : MyClass <MyProtocol>
48*67e74705SXin Li{
49*67e74705SXin Li}
50*67e74705SXin Li@end
51*67e74705SXin Li
52*67e74705SXin Li@interface MyTestClass : NSObject
53*67e74705SXin Li{
54*67e74705SXin Li@private
55*67e74705SXin Li	NSObject <MyProtocol> *someObj;
56*67e74705SXin Li}
57*67e74705SXin Li
58*67e74705SXin Li@property (nonatomic, assign) NSObject <MyProtocol> *someObj;
59*67e74705SXin Li
60*67e74705SXin Li@end
61*67e74705SXin Li
62*67e74705SXin Li@implementation MyTestClass
63*67e74705SXin Li
64*67e74705SXin Li@synthesize someObj;
65*67e74705SXin Li
66*67e74705SXin Li- (void)someMethod
67*67e74705SXin Li{
68*67e74705SXin Li	MySubclass *foo;
69*67e74705SXin Li	[self setSomeObj:foo]; // no warning here!
70*67e74705SXin Li}
71*67e74705SXin Li
72*67e74705SXin Li@end
73