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