1 | // RUN: %clang_cc1 -triple x86_64-apple-darwin11 -fobjc-runtime-has-weak -fsyntax-only -fobjc-arc -verify -Wno-objc-root-class %s |
2 | // rdar://9340606 |
3 | |
4 | @interface Foo { |
5 | @public |
6 | id __unsafe_unretained x; // expected-error {{existing instance variable 'x' for strong property 'x' may not be __unsafe_unretained}} |
7 | id __weak y; // expected-error {{existing instance variable 'y' for strong property 'y' may not be __weak}} |
8 | id __autoreleasing z; // expected-error {{instance variables cannot have __autoreleasing ownership}} |
9 | } |
10 | @property(strong) id x; // expected-note {{property declared here}} |
11 | @property(strong) id y; // expected-note {{property declared here}} |
12 | @property(strong) id z; |
13 | @end |
14 | |
15 | @implementation Foo |
16 | @synthesize x; // expected-note {{property synthesized here}} |
17 | @synthesize y; // expected-note {{property synthesized here}} |
18 | @synthesize z; // suppressed |
19 | @end |
20 | |
21 | @interface Bar { |
22 | @public |
23 | id __unsafe_unretained x; // expected-error {{existing instance variable 'x' for strong property 'x' may not be __unsafe_unretained}} |
24 | id __weak y; // expected-error {{existing instance variable 'y' for strong property 'y' may not be __weak}} |
25 | id __autoreleasing z; // expected-error {{instance variables cannot have __autoreleasing ownership}} |
26 | } |
27 | @property(retain) id x; // expected-note {{property declared here}} |
28 | @property(retain) id y; // expected-note {{property declared here}} |
29 | @property(retain) id z; |
30 | @end |
31 | |
32 | @implementation Bar |
33 | @synthesize x; // expected-note {{property synthesized here}} |
34 | @synthesize y; // expected-note {{property synthesized here}} |
35 | @synthesize z; // suppressed |
36 | @end |
37 | |
38 | @interface Bas { |
39 | @public |
40 | id __unsafe_unretained x; // expected-error {{existing instance variable 'x' for strong property 'x' may not be __unsafe_unretained}} |
41 | id __weak y; // expected-error {{existing instance variable 'y' for strong property 'y' may not be __weak}} |
42 | id __autoreleasing z; // expected-error {{instance variables cannot have __autoreleasing ownership}} |
43 | } |
44 | @property(copy) id x; // expected-note {{property declared here}} |
45 | @property(copy) id y; // expected-note {{property declared here}} |
46 | @property(copy) id z; |
47 | @end |
48 | |
49 | @implementation Bas |
50 | @synthesize x; // expected-note {{property synthesized here}} |
51 | @synthesize y; // expected-note {{property synthesized here}} |
52 | @synthesize z; // suppressed |
53 | @end |
54 | |
55 | @interface Bat |
56 | @property(strong) __unsafe_unretained id x; // expected-error {{strong property 'x' may not also be declared __unsafe_unretained}} |
57 | @property(strong) __autoreleasing id z; // expected-error {{strong property 'z' may not also be declared __autoreleasing}} |
58 | @end |
59 | |
60 | @interface Bau |
61 | @property(retain) __unsafe_unretained id x; // expected-error {{strong property 'x' may not also be declared __unsafe_unretained}} |
62 | @property(retain) __autoreleasing id z; // expected-error {{strong property 'z' may not also be declared __autoreleasing}} |
63 | @end |
64 | |
65 | @interface Bav |
66 | @property(copy) __unsafe_unretained id x; // expected-error {{strong property 'x' may not also be declared __unsafe_unretained}} |
67 | @property(copy) __autoreleasing id z; // expected-error {{strong property 'z' may not also be declared __autoreleasing}} |
68 | @end |
69 | |
70 | // rdar://9341593 |
71 | @interface Gorf { |
72 | id __unsafe_unretained x; |
73 | id y; // expected-error {{existing instance variable 'y' for property 'y' with assign attribute must be __unsafe_unretained}} |
74 | } |
75 | @property(assign) id __unsafe_unretained x; |
76 | @property(assign) id y; // expected-note {{property declared here}} |
77 | @property(assign) id z; |
78 | @end |
79 | |
80 | @implementation Gorf |
81 | @synthesize x; |
82 | @synthesize y; // expected-note {{property synthesized here}} |
83 | @synthesize z; |
84 | @end |
85 | |
86 | @interface Gorf2 { |
87 | id __unsafe_unretained x; |
88 | id y; // expected-error {{existing instance variable 'y' for property 'y' with unsafe_unretained attribute must be __unsafe_unretained}} |
89 | } |
90 | @property(unsafe_unretained) id __unsafe_unretained x; |
91 | @property(unsafe_unretained) id y; // expected-note {{property declared here}} |
92 | @property(unsafe_unretained) id z; |
93 | @end |
94 | |
95 | @implementation Gorf2 |
96 | @synthesize x; |
97 | @synthesize y; // expected-note {{property synthesized here}} |
98 | @synthesize z; |
99 | @end |
100 | |
101 | // rdar://9355230 |
102 | @interface I { |
103 | char _isAutosaving; |
104 | } |
105 | @property char isAutosaving; |
106 | |
107 | @end |
108 | |
109 | @implementation I |
110 | @synthesize isAutosaving = _isAutosaving; |
111 | @end |
112 | |
113 | // rdar://10239594 |
114 | // Test for 'Class' properties being unretained. |
115 | @interface MyClass { |
116 | @private |
117 | Class _controllerClass; |
118 | id _controllerId; |
119 | } |
120 | @property (copy) Class controllerClass; |
121 | @property (copy) id controllerId; |
122 | @end |
123 | |
124 | @implementation MyClass |
125 | @synthesize controllerClass = _controllerClass; |
126 | @synthesize controllerId = _controllerId; |
127 | @end |
128 | |
129 | // rdar://10630891 |
130 | @interface UIView @end |
131 | @class UIColor; |
132 | |
133 | @interface UIView(UIViewRendering) |
134 | @property(nonatomic,copy) UIColor *backgroundColor; |
135 | @end |
136 | |
137 | @interface UILabel : UIView |
138 | @end |
139 | |
140 | @interface MyView |
141 | @property (strong) UILabel *label; |
142 | @end |
143 | |
144 | @interface MyView2 : MyView @end |
145 | |
146 | @implementation MyView2 |
147 | - (void)foo { |
148 | super.label.backgroundColor = 0; |
149 | } |
150 | @end |
151 | |
152 | // rdar://10694932 |
153 | @interface Baz |
154 | @property id prop; |
155 | @property __strong id strong_prop; |
156 | @property (strong) id strong_attr_prop; |
157 | @property (strong) __strong id really_strong_attr_prop; |
158 | + (id) alloc; |
159 | - (id) init; |
160 | - (id) implicit; |
161 | - (void) setImplicit : (id) arg; |
162 | @end |
163 | |
164 | void foo(Baz *f) { |
165 | f.prop = [[Baz alloc] init]; |
166 | f.strong_prop = [[Baz alloc] init]; |
167 | f.strong_attr_prop = [[Baz alloc] init]; |
168 | f.really_strong_attr_prop = [[Baz alloc] init]; |
169 | f.implicit = [[Baz alloc] init]; |
170 | } |
171 | |
172 | // rdar://11253688 |
173 | @interface Boom |
174 | { |
175 | 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}} |
176 | } |
177 | @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}} |
178 | - (Boom *) NotInnerPointerMethod __attribute__((objc_returns_inner_pointer)); // expected-warning {{'objc_returns_inner_pointer' attribute only applies to methods that return a non-retainable pointer}} |
179 | @property (readonly) const void * innerPointer __attribute__((objc_returns_inner_pointer)); |
180 | @end |
181 | |
182 | @interface Foo2 { |
183 | id _prop; // expected-error {{existing instance variable '_prop' for property 'prop' with assign attribute must be __unsafe_unretained}} |
184 | } |
185 | @property (nonatomic, assign) id prop; // expected-note {{property declared here}} |
186 | @end |
187 | |
188 | @implementation Foo2 |
189 | @end |
190 | |
191 | // rdar://13885083 |
192 | @interface NSObject |
193 | -(id)init; |
194 | @end |
195 | |
196 | typedef char BOOL; |
197 | @interface Test13885083 : NSObject |
198 | |
199 | @property (nonatomic, assign) BOOL retain; // expected-error {{ARC forbids synthesis of 'retain'}} |
200 | |
201 | -(id)init; |
202 | |
203 | @end |
204 | |
205 | @implementation Test13885083 |
206 | -(id) init |
207 | { |
208 | self = [super init]; |
209 | return self; |
210 | } |
211 | @end |
212 | |
213 | |