116 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Objective-C
		
	
	
	
			
		
		
	
	
			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
 |