blob: 2311ef2437cd244dacff413b44a8fa6a198a53a3 [file] [log] [blame]
Anna Zaks88a83e32012-09-27 19:45:15 +00001// RUN: %clang_cc1 -analyze -analyzer-checker=alpha.osx.cocoa.DirectIvarAssignment -fobjc-default-synthesize-properties -Wno-objc-root-class -verify -fblocks %s
2
3@interface MyClass;
4@end
5@interface TestProperty {
6 MyClass *_Z;
7 id _nonSynth;
8}
9
10 @property (assign, nonatomic) MyClass* A; // explicitely synthesized, not implemented, non-default ivar name
11
12 @property (assign) MyClass* X; // automatically synthesized, not implemented
13
14 @property (assign, nonatomic) MyClass* Y; // automatically synthesized, implemented
15
Anna Zaksbf247922012-09-27 21:57:17 +000016 @property (assign, nonatomic) MyClass* Z; // non synthesized ivar, implemented setter
Anna Zaks88a83e32012-09-27 19:45:15 +000017 @property (readonly) id nonSynth; // non synthesized, explicitly implemented to return ivar with expected name
18
19 - (id) initWithPtr:(MyClass*) value;
20 - (id) myInitWithPtr:(MyClass*) value;
21 - (void) someMethod: (MyClass*)In;
22@end
23
24@implementation TestProperty
25 @synthesize A = __A;
26
27 - (id) initWithPtr: (MyClass*) value {
28 _Y = value; // no-warning
29 return self;
30 }
31
32 - (id) myInitWithPtr: (MyClass*) value {
33 _Y = value; // no-warning
34 return self;
35 }
36
37 - (void) setY:(MyClass*) NewValue {
38 _Y = NewValue; // no-warning
39 }
40
41 - (void) setZ:(MyClass*) NewValue {
42 _Z = NewValue; // no-warning
43 }
44
45 - (id)nonSynth {
46 return _nonSynth;
47 }
48
49 - (void) someMethod: (MyClass*)In {
Anna Zaksbf247922012-09-27 21:57:17 +000050 (__A) = In; // expected-warning {{Direct assignment to an instance variable backing a property; use the setter instead}}
Anna Zaks88a83e32012-09-27 19:45:15 +000051 _X = In; // expected-warning {{Direct assignment to an instance variable backing a property; use the setter instead}}
52 _Y = In; // expected-warning {{Direct assignment to an instance variable backing a property; use the setter instead}}
53 _Z = In; // expected-warning {{Direct assignment to an instance variable backing a property; use the setter instead}}
54 _nonSynth = 0; // expected-warning {{Direct assignment to an instance variable backing a property; use the setter instead}}
55 }
56@end