diff options
Diffstat (limited to 'clang/test/Analysis/objc/direct-ivar-assignment-in-annotated-functions.m')
-rw-r--r-- | clang/test/Analysis/objc/direct-ivar-assignment-in-annotated-functions.m | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/clang/test/Analysis/objc/direct-ivar-assignment-in-annotated-functions.m b/clang/test/Analysis/objc/direct-ivar-assignment-in-annotated-functions.m new file mode 100644 index 00000000000..7a90fb4dacd --- /dev/null +++ b/clang/test/Analysis/objc/direct-ivar-assignment-in-annotated-functions.m @@ -0,0 +1,56 @@ +// RUN: %clang_cc1 -analyze -analyzer-checker=alpha.osx.cocoa.DirectIvarAssignmentForAnnotatedFunctions -fobjc-default-synthesize-properties -verify -fblocks %s + +typedef signed char BOOL; +@protocol NSObject - (BOOL)isEqual:(id)object; @end +@interface NSObject <NSObject> {} ++(id)alloc; +-(id)init; +-(id)autorelease; +-(id)copy; +-(id)retain; +@end + +@interface MyClass; +@end + +@interface AnnotatedClass :NSObject { +} + - (void) someMethod: (MyClass*)In __attribute__((annotate("objc_no_direct_instance_variable_assignmemt"))); + - (void) someMethodNotAnnaotated: (MyClass*)In; +@end + + +@interface TestProperty :AnnotatedClass { + MyClass *_Z; + id _nonSynth; +} + + @property (assign, nonatomic) MyClass* A; // explicitely synthesized, not implemented, non-default ivar name + + @property (assign) MyClass* X; // automatically synthesized, not implemented + + @property (assign, nonatomic) MyClass* Y; // automatically synthesized, implemented + + @property (assign, nonatomic) MyClass* Z; // non synthesized ivar, implemented setter + @property (readonly) id nonSynth; // non synthesized, explicitly implemented to return ivar with expected name + @end + +@implementation TestProperty + @synthesize A = __A; + + - (void) someMethod: (MyClass*)In { + (__A) = In; // expected-warning {{Direct assignment to an instance variable backing a property; use the setter instead}} + _X = In; // expected-warning {{Direct assignment to an instance variable backing a property; use the setter instead}} + _Y = In; // expected-warning {{Direct assignment to an instance variable backing a property; use the setter instead}} + _Z = In; // expected-warning {{Direct assignment to an instance variable backing a property; use the setter instead}} + _nonSynth = 0; // expected-warning {{Direct assignment to an instance variable backing a property; use the setter instead}} + } + - (void) someMethodNotAnnaotated: (MyClass*)In { + (__A) = In; + _X = In; // no-warning + _Y = In; // no-warning + _Z = In; // no-warning + _nonSynth = 0; // no-warning + } + +@end
\ No newline at end of file |