forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			55 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Objective-C
		
	
	
	
			
		
		
	
	
			55 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Objective-C
		
	
	
	
| // RUN: %clang_cc1 -analyze -analyzer-store=region -analyzer-constraints=range -fblocks -analyzer-opt-analyze-nested-blocks -analyzer-checker=deadcode.IdempotentOperations -verify %s
 | |
| 
 | |
| typedef signed char BOOL;
 | |
| typedef unsigned long NSUInteger;
 | |
| typedef struct _NSZone NSZone;
 | |
| @protocol NSObject  - (BOOL)isEqual:(id)object;
 | |
| @end
 | |
| 
 | |
| @interface NSObject {}
 | |
|   @property int locked;
 | |
|   @property(nonatomic, readonly) NSObject *media;
 | |
| @end
 | |
| 
 | |
| // <rdar://problem/8725041> - Don't flag idempotent operation warnings when
 | |
| // a method may invalidate an instance variable.
 | |
| @interface Rdar8725041 : NSObject {
 | |
|   id _attribute;
 | |
| }
 | |
|   - (void) method2;
 | |
| @end
 | |
| 
 | |
| @implementation Rdar8725041
 | |
| - (BOOL) method1 {
 | |
|   BOOL needsUpdate = (BOOL)0;
 | |
|   id oldAttribute = _attribute;
 | |
|   [self method2];
 | |
|   needsUpdate |= (_attribute != oldAttribute); // no-warning
 | |
|   return needsUpdate;
 | |
| }
 | |
| 
 | |
| - (void) method2
 | |
| {
 | |
|   _attribute = ((void*)0);
 | |
| }
 | |
| @end
 | |
| 
 | |
| // Test that the idempotent operations checker works in the prescence
 | |
| // of property expressions.
 | |
| void pr9116(NSObject *placeholder) {
 | |
|   int x = placeholder.media.locked = placeholder ? 1 : 0;
 | |
| }
 | |
| 
 | |
| // <rdar://problem/9130239>: Test that calling property setters doesn't 
 | |
| // trigger an assertion failure when the object is nil.
 | |
| @interface RDar9130239
 | |
| @property (assign) id delegate;
 | |
| @end
 | |
| 
 | |
| void test_RDar9130239(RDar9130239 *x) {
 | |
|   if (x)
 | |
|     return;
 | |
|   x.delegate = x; // no-warning
 | |
| }
 | |
| 
 |