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