| // RUN: %clang_cc1 -analyze -analyzer-store=region -analyzer-constraints=range -fblocks -analyzer-opt-analyze-nested-blocks -analyzer-check-objc-mem -analyzer-checker=core.experimental.IdempotentOps -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; |
| } |
| |