[clang] Implement lifetime analysis for lifetime_capture_by(X) (#115921)
[llvm-project.git] / clang / test / SemaObjC / arc-property-lifetime.m
blob0e7b69085b0d2ed98048a30587dfded94753fe92
1 // RUN: %clang_cc1 -triple x86_64-apple-darwin11 -fobjc-runtime-has-weak -fsyntax-only -fobjc-arc -verify -Wno-objc-root-class %s
3 @interface Foo {
4 @public
5     id __unsafe_unretained x; // expected-error {{existing instance variable 'x' for strong property 'x' may not be __unsafe_unretained}}
6     id __weak y; // expected-error {{existing instance variable 'y' for strong property 'y' may not be __weak}}
7     id __autoreleasing z; // expected-error {{instance variables cannot have __autoreleasing ownership}}
9 @property(strong) id x; // expected-note {{property declared here}}
10 @property(strong) id y; // expected-note {{property declared here}}
11 @property(strong) id z;
12 @end
14 @implementation Foo
15 @synthesize x; // expected-note {{property synthesized here}}
16 @synthesize y; // expected-note {{property synthesized here}}
17 @synthesize z; // suppressed
18 @end
20 @interface Bar {
21 @public
22     id __unsafe_unretained x; // expected-error {{existing instance variable 'x' for strong property 'x' may not be __unsafe_unretained}}
23     id __weak y; // expected-error {{existing instance variable 'y' for strong property 'y' may not be __weak}}
24     id __autoreleasing z; // expected-error {{instance variables cannot have __autoreleasing ownership}}
26 @property(retain) id x; // expected-note {{property declared here}}
27 @property(retain) id y; // expected-note {{property declared here}}
28 @property(retain) id z;
29 @end
31 @implementation Bar
32 @synthesize x; // expected-note {{property synthesized here}}
33 @synthesize y; // expected-note {{property synthesized here}}
34 @synthesize z; // suppressed
35 @end
37 @interface Bas {
38 @public
39     id __unsafe_unretained x; // expected-error {{existing instance variable 'x' for strong property 'x' may not be __unsafe_unretained}}
40     id __weak y; // expected-error {{existing instance variable 'y' for strong property 'y' may not be __weak}}
41     id __autoreleasing z; // expected-error {{instance variables cannot have __autoreleasing ownership}}
43 @property(copy) id x; // expected-note {{property declared here}}
44 @property(copy) id y; // expected-note {{property declared here}} 
45 @property(copy) id z;
46 @end
48 @implementation Bas
49 @synthesize x; // expected-note {{property synthesized here}}
50 @synthesize y; // expected-note {{property synthesized here}}
51 @synthesize z; // suppressed
52 @end
54 @interface Bat 
55 @property(strong) __unsafe_unretained id x; // expected-error {{strong property 'x' may not also be declared __unsafe_unretained}}
56 @property(strong) __autoreleasing id z; // expected-error {{strong property 'z' may not also be declared __autoreleasing}}
57 @end
59 @interface Bau 
60 @property(retain) __unsafe_unretained id x; // expected-error {{strong property 'x' may not also be declared __unsafe_unretained}}
61 @property(retain) __autoreleasing id z; // expected-error {{strong property 'z' may not also be declared __autoreleasing}}
62 @end
64 @interface Bav 
65 @property(copy) __unsafe_unretained id x; // expected-error {{strong property 'x' may not also be declared __unsafe_unretained}}
66 @property(copy) __autoreleasing id z; // expected-error {{strong property 'z' may not also be declared __autoreleasing}}
67 @end
69 @interface Gorf  {
70    id __unsafe_unretained x;
71    id y; // expected-error {{existing instance variable 'y' for property 'y' with assign attribute must be __unsafe_unretained}}
73 @property(assign) id __unsafe_unretained x;
74 @property(assign) id y; // expected-note {{property declared here}}
75 @property(assign) id z;
76 @end
78 @implementation Gorf
79 @synthesize x;
80 @synthesize y; // expected-note {{property synthesized here}}
81 @synthesize z;
82 @end
84 @interface Gorf2  {
85    id __unsafe_unretained x;
86    id y; // expected-error {{existing instance variable 'y' for property 'y' with unsafe_unretained attribute must be __unsafe_unretained}}
88 @property(unsafe_unretained) id __unsafe_unretained x;
89 @property(unsafe_unretained) id y; // expected-note {{property declared here}}
90 @property(unsafe_unretained) id z;
91 @end
93 @implementation Gorf2
94 @synthesize x;
95 @synthesize y; // expected-note {{property synthesized here}}
96 @synthesize z;
97 @end
99 @interface I {
100   char _isAutosaving;
102 @property char isAutosaving;
104 @end
106 @implementation I
107 @synthesize isAutosaving = _isAutosaving;
108 @end
110 // Test for 'Class' properties being unretained.
111 @interface MyClass {
112 @private
113     Class _controllerClass;
114     id _controllerId;
116 @property (copy) Class controllerClass;
117 @property (copy) id controllerId;
118 @end
120 @implementation MyClass
121 @synthesize controllerClass = _controllerClass;
122 @synthesize controllerId = _controllerId;
123 @end
125 @interface UIView @end
126 @class UIColor;
128 @interface UIView(UIViewRendering)
129 @property(nonatomic,copy) UIColor *backgroundColor;
130 @end
132 @interface UILabel : UIView
133 @end
135 @interface MyView 
136 @property (strong) UILabel *label;
137 @end
139 @interface MyView2 : MyView @end
141 @implementation MyView2
142 - (void)foo {
143   super.label.backgroundColor = 0;
145 @end
147 @interface Baz 
148 @property  id prop;
149 @property  __strong id strong_prop;
150 @property  (strong) id strong_attr_prop;
151 @property  (strong) __strong id really_strong_attr_prop;
152 + (id) alloc;
153 - (id) init;
154 - (id) implicit;
155 - (void) setImplicit : (id) arg; 
156 @end
158 void foo(Baz *f) {
159         f.prop = [[Baz alloc] init];
160         f.strong_prop = [[Baz alloc] init];
161         f.strong_attr_prop = [[Baz alloc] init];
162         f.really_strong_attr_prop = [[Baz alloc] init];
163         f.implicit = [[Baz alloc] init];
166 @interface Boom 
168   const void * innerPointerIvar __attribute__((objc_returns_inner_pointer)); // expected-error {{'objc_returns_inner_pointer' attribute only applies to Objective-C methods and Objective-C properties}}
170 @property (readonly) Boom * NotInnerPointer __attribute__((objc_returns_inner_pointer)); // expected-warning {{'objc_returns_inner_pointer' attribute only applies to properties that return a non-retainable pointer}}
171 - (Boom *) NotInnerPointerMethod __attribute__((objc_returns_inner_pointer)); // expected-warning {{'objc_returns_inner_pointer' attribute only applies to methods that return a non-retainable pointer}}
172 @property (readonly) const void * innerPointer __attribute__((objc_returns_inner_pointer));
173 @end
175 @interface Foo2 {
176   id _prop; // expected-error {{existing instance variable '_prop' for property 'prop' with assign attribute must be __unsafe_unretained}}
178 @property (nonatomic, assign) id prop; // expected-note {{property declared here}}
179 @end
181 @implementation Foo2
182 @end
184 @interface NSObject 
185 -(id)init;
186 @end
188 typedef char BOOL;
189 @interface Test13885083 : NSObject
191 @property (nonatomic, assign) BOOL retain; // expected-error {{ARC forbids synthesis of 'retain'}}
193 -(id)init;
195 @end
197 @implementation Test13885083
198 -(id) init
200   self = [super init];
201   return self;
203 @end