xref: /aosp_15_r20/external/clang/test/SemaObjC/method-conflict-1.m (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li// RUN: %clang_cc1 -fsyntax-only -verify -Wno-objc-root-class %s
2*67e74705SXin Li// expected-no-diagnostics
3*67e74705SXin Li
4*67e74705SXin Li// This test case tests the default behavior.
5*67e74705SXin Li
6*67e74705SXin Li// rdar://7933061
7*67e74705SXin Li
8*67e74705SXin Li@interface NSObject @end
9*67e74705SXin Li
10*67e74705SXin Li@interface NSArray : NSObject @end
11*67e74705SXin Li
12*67e74705SXin Li@interface MyClass : NSObject {
13*67e74705SXin Li}
14*67e74705SXin Li- (void)myMethod:(NSArray *)object;
15*67e74705SXin Li- (void)myMethod1:(NSObject *)object; // broken-note {{previous definition is here}}
16*67e74705SXin Li@end
17*67e74705SXin Li
18*67e74705SXin Li@implementation MyClass
19*67e74705SXin Li- (void)myMethod:(NSObject *)object {
20*67e74705SXin Li}
21*67e74705SXin Li- (void)myMethod1:(NSArray *)object { // broken-warning {{conflicting parameter types in implementation of 'myMethod1:': 'NSObject *' vs 'NSArray *'}}
22*67e74705SXin Li}
23*67e74705SXin Li@end
24*67e74705SXin Li
25*67e74705SXin Li
26*67e74705SXin Li@protocol MyProtocol @end
27*67e74705SXin Li
28*67e74705SXin Li@interface MyOtherClass : NSObject <MyProtocol> {
29*67e74705SXin Li}
30*67e74705SXin Li- (void)myMethod:(id <MyProtocol>)object; // broken-note {{previous definition is here}}
31*67e74705SXin Li- (void)myMethod1:(id <MyProtocol>)object; // broken-note {{previous definition is here}}
32*67e74705SXin Li@end
33*67e74705SXin Li
34*67e74705SXin Li@implementation MyOtherClass
35*67e74705SXin Li- (void)myMethod:(MyClass *)object { // broken-warning {{conflicting parameter types in implementation of 'myMethod:': 'id<MyProtocol>' vs 'MyClass *'}}
36*67e74705SXin Li}
37*67e74705SXin Li- (void)myMethod1:(MyClass<MyProtocol> *)object { // broken-warning {{conflicting parameter types in implementation of 'myMethod1:': 'id<MyProtocol>' vs 'MyClass<MyProtocol> *'}}
38*67e74705SXin Li}
39*67e74705SXin Li@end
40*67e74705SXin Li
41*67e74705SXin Li
42*67e74705SXin Li
43*67e74705SXin Li@interface A @end
44*67e74705SXin Li@interface B : A @end
45*67e74705SXin Li
46*67e74705SXin Li@interface Test1 {}
47*67e74705SXin Li- (void) test1:(A*) object; // broken-note {{previous definition is here}}
48*67e74705SXin Li- (void) test2:(B*) object;
49*67e74705SXin Li@end
50*67e74705SXin Li
51*67e74705SXin Li@implementation Test1
52*67e74705SXin Li- (void) test1:(B*) object {} // broken-warning {{conflicting parameter types in implementation of 'test1:': 'A *' vs 'B *'}}
53*67e74705SXin Li- (void) test2:(A*) object {}
54*67e74705SXin Li@end
55*67e74705SXin Li
56*67e74705SXin Li// rdar://problem/8597621 wants id -> A* to be an exception
57*67e74705SXin Li@interface Test2 {}
58*67e74705SXin Li- (void) test1:(id) object; // broken-note {{previous definition is here}}
59*67e74705SXin Li- (void) test2:(A*) object;
60*67e74705SXin Li@end
61*67e74705SXin Li@implementation Test2
62*67e74705SXin Li- (void) test1:(A*) object {} // broken-warning {{conflicting parameter types in implementation of 'test1:': 'id' vs 'A *'}}
63*67e74705SXin Li- (void) test2:(id) object {}
64*67e74705SXin Li@end
65*67e74705SXin Li
66*67e74705SXin Li@interface Test3 {}
67*67e74705SXin Li- (A*) test1;
68*67e74705SXin Li- (B*) test2; // broken-note {{previous definition is here}}
69*67e74705SXin Li@end
70*67e74705SXin Li
71*67e74705SXin Li@implementation Test3
72*67e74705SXin Li- (B*) test1 { return 0; }
73*67e74705SXin Li- (A*) test2 { return 0; } // broken-warning {{conflicting return type in implementation of 'test2': 'B *' vs 'A *'}}
74*67e74705SXin Li@end
75*67e74705SXin Li
76*67e74705SXin Li// The particular case of overriding with an id return is white-listed.
77*67e74705SXin Li@interface Test4 {}
78*67e74705SXin Li- (id) test1;
79*67e74705SXin Li- (A*) test2;
80*67e74705SXin Li@end
81*67e74705SXin Li@implementation Test4
82*67e74705SXin Li- (A*) test1 { return 0; } // id -> A* is rdar://problem/8596987
83*67e74705SXin Li- (id) test2 { return 0; }
84*67e74705SXin Li@end
85