direct-ivar-assignment-in-annotated-functions.m revision 39a62fcd3003785d9cc913ab2820be2f6f27bb40
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// RUN: %clang_cc1 -analyze -analyzer-checker=alpha.osx.cocoa.DirectIvarAssignmentForAnnotatedFunctions -fobjc-default-synthesize-properties -verify -fblocks %s 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projecttypedef signed char BOOL; 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project@protocol NSObject - (BOOL)isEqual:(id)object; @end 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project@interface NSObject <NSObject> {} 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project+(id)alloc; 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project-(id)init; 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project-(id)autorelease; 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project-(id)copy; 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project-(id)retain; 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project@end 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project@interface MyClass; 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project@end 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project@interface AnnotatedClass :NSObject { 17c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project} 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project - (void) someMethod: (MyClass*)In __attribute__((annotate("objc_no_direct_instance_variable_assignmemt"))); 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project - (void) someMethodNotAnnaotated: (MyClass*)In; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project@end 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project@interface TestProperty :AnnotatedClass { 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project MyClass *_Z; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project id _nonSynth; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 27c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project 28c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project @property (assign, nonatomic) MyClass* A; // explicitely synthesized, not implemented, non-default ivar name 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project @property (assign) MyClass* X; // automatically synthesized, not implemented 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @property (assign, nonatomic) MyClass* Y; // automatically synthesized, implemented 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @property (assign, nonatomic) MyClass* Z; // non synthesized ivar, implemented setter 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @property (readonly) id nonSynth; // non synthesized, explicitly implemented to return ivar with expected name 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @end 37c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project@implementation TestProperty 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @synthesize A = __A; 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project - (void) someMethod: (MyClass*)In { 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (__A) = In; // expected-warning {{Direct assignment to an instance variable backing a property; use the setter instead}} 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project _X = In; // expected-warning {{Direct assignment to an instance variable backing a property; use the setter instead}} 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project _Y = In; // expected-warning {{Direct assignment to an instance variable backing a property; use the setter instead}} 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project _Z = In; // expected-warning {{Direct assignment to an instance variable backing a property; use the setter instead}} 46c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project _nonSynth = 0; // expected-warning {{Direct assignment to an instance variable backing a property; use the setter instead}} 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 48c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project - (void) someMethodNotAnnaotated: (MyClass*)In { 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (__A) = In; 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project _X = In; // no-warning 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project _Y = In; // no-warning 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project _Z = In; // no-warning 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project _nonSynth = 0; // no-warning 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project@end