llvm-project/clang/test/SemaObjC/method-conflict-2.m
Fariborz Jahanian 8181caa44e ObjectiveC [Sema]. This patch makes sure that all inherited
properties (direct or indirect) setter/getter (or declared 
methods as well) are seen by the method implementation type 
matching logic before declaration of method in super class 
is seen. This fixes the warning coming out of that method mismatch.
// rdar://14650159

llvm-svn: 188438
2013-08-14 23:58:55 +00:00

116 lines
2.8 KiB
Objective-C

// RUN: %clang_cc1 -Wmethod-signatures -fsyntax-only -verify -Wno-objc-root-class %s
// RUN: %clang_cc1 -x objective-c++ -Wmethod-signatures -fsyntax-only -verify -Wno-objc-root-class %s
@interface A @end
@interface B : A @end
@interface Test1 {}
- (void) test1:(A*) object; // expected-note {{previous definition is here}}
- (void) test2:(B*) object;
@end
@implementation Test1
- (void) test1:(B*) object {} // expected-warning {{conflicting parameter types in implementation of 'test1:': 'A *' vs 'B *'}}
- (void) test2:(A*) object {}
@end
@interface Test2 {}
- (void) test1:(id) object; // expected-note {{previous definition is here}}
- (void) test2:(A*) object;
@end
@implementation Test2
- (void) test1:(A*) object {} // expected-warning {{conflicting parameter types in implementation of 'test1:': 'id' vs 'A *'}}
- (void) test2:(id) object {}
@end
@interface Test3 {}
- (A*) test1;
- (B*) test2; // expected-note {{previous definition is here}}
@end
@implementation Test3
- (B*) test1 { return 0; }
- (A*) test2 { return 0; } // expected-warning {{conflicting return type in implementation of 'test2': 'B *' vs 'A *'}}
@end
// The particular case of overriding with an id return is white-listed.
@interface Test4 {}
- (id) test1;
- (A*) test2;
@end
@implementation Test4
- (A*) test1 { return 0; } // id -> A* is rdar://problem/8596987
- (id) test2 { return 0; }
@end
// rdar://12522752
typedef int int32_t;
typedef long long int64_t;
@interface NSObject @end
@protocol CKMessage
@property (nonatomic,readonly,assign) int64_t sequenceNumber; // expected-note {{previous definition is here}}
@end
@protocol CKMessage;
@interface CKIMMessage : NSObject<CKMessage>
@end
@implementation CKIMMessage
- (int32_t)sequenceNumber { // expected-warning {{conflicting return type in implementation of 'sequenceNumber': 'int64_t' (aka 'long long') vs 'int32_t' (aka 'int')}}
return 0;
}
@end
// rdar://14650159
// Tests that property inherited indirectly from a nested protocol
// is seen by the method implementation type matching logic before
// method in super class is seen. This fixes the warning coming
// out of that method mismatch.
@interface NSObject (NSDict)
- (void)setValue:(id)value;
- (id)value;
@end
@protocol ProtocolWithValue
@property (nonatomic) unsigned value;
@end
@protocol InterveningProtocol <ProtocolWithValue>
@end
@interface UsesProtocolWithValue : NSObject <ProtocolWithValue>
@end
@implementation UsesProtocolWithValue
@synthesize value=_value;
- (unsigned) value
{
return _value;
}
- (void) setValue:(unsigned)value
{
_value = value;
}
@end
@interface UsesInterveningProtocol : NSObject <InterveningProtocol>
@end
@implementation UsesInterveningProtocol
@synthesize value=_value;
- (unsigned) value
{
return _value;
}
- (void) setValue:(unsigned)value
{
_value = value;
}
@end