Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / clang / test / SemaObjC / arc-property-decl-attrs.m
blobfc5a84d92a35ded098e58c6420c829317063290c
1 // RUN: %clang_cc1 -triple x86_64-apple-darwin11 -fobjc-runtime-has-weak -fsyntax-only -fobjc-arc -verify %s
3 @interface Foo {
4 @public
5     id __unsafe_unretained x;
6     id __weak y;
7     id __autoreleasing z; // expected-error {{instance variables cannot have __autoreleasing ownership}}
9 @property(strong) id x;
10 @property(strong) id y;
11 @property(strong) id z;
12 @end
14 @interface Bar {
15 @public
16     id __unsafe_unretained x;
17     id __weak y;
18     id __autoreleasing z; // expected-error {{instance variables cannot have __autoreleasing ownership}}
20 @property(retain) id x;
21 @property(retain) id y;
22 @property(retain) id z;
23 @end
25 @interface Bas {
26 @public
27     id __unsafe_unretained x;
28     id __weak y;
29     id __autoreleasing z; // expected-error {{instance variables cannot have __autoreleasing ownership}}
31 @property(copy) id x;
32 @property(copy) id y;
33 @property(copy) id z;
34 @end
36 // Errors should start about here :-)
38 @interface Bat 
39 @property(strong) __unsafe_unretained id x; // expected-error {{strong property 'x' may not also be declared __unsafe_unretained}}
40 @property(strong) __weak id y; // expected-error {{strong property 'y' may not also be declared __weak}}
41 @property(strong) __autoreleasing id z; // expected-error {{strong property 'z' may not also be declared __autoreleasing}}
42 @end
44 @interface Bau
45 @property(retain) __unsafe_unretained id x; // expected-error {{strong property 'x' may not also be declared __unsafe_unretained}}
46 @property(retain) __weak id y; // expected-error {{strong property 'y' may not also be declared __weak}}
47 @property(retain) __autoreleasing id z; // expected-error {{strong property 'z' may not also be declared __autoreleasing}}
48 @end
50 @interface Bav 
51 @property(copy) __unsafe_unretained id x; // expected-error {{strong property 'x' may not also be declared __unsafe_unretained}}
52 @property(copy) __weak id y; // expected-error {{strong property 'y' may not also be declared __weak}}
53 @property(copy) __autoreleasing id z; // expected-error {{strong property 'z' may not also be declared __autoreleasing}}
54 @end
56 @interface Bingo 
57 @property(assign) __unsafe_unretained id x;
58 @property(assign) __weak id y; // expected-error {{unsafe_unretained property 'y' may not also be declared __weak}}
59 @property(assign) __autoreleasing id z; // expected-error {{unsafe_unretained property 'z' may not also be declared __autoreleasing}}
60 @end
62 @interface Batman 
63 @property(unsafe_unretained) __unsafe_unretained id x;
64 @property(unsafe_unretained) __weak id y; // expected-error {{unsafe_unretained property 'y' may not also be declared __weak}}
65 @property(unsafe_unretained) __autoreleasing id z; // expected-error {{unsafe_unretained property 'z' may not also be declared __autoreleasing}}
66 @end
68 @interface Super
69 @property (readonly, retain) id foo;
70 @property (readonly, weak) id fee;
71 @property (readonly, strong) id frr;
72 @end
74 @interface Bugg : Super
75 @property (readwrite) id foo;
76 @property (readwrite) id fee;
77 @property (readwrite) id frr;
78 @end
80 @interface NSObject @end
82 #pragma clang assume_nonnull begin
83 @interface I: NSObject
84 @property(nonatomic, weak) id delegate; // Do not warn, nullable is inferred. 
85 @property(nonatomic, weak, readonly) id ROdelegate; // Do not warn, nullable is inferred.
86 @property(nonatomic, weak, nonnull) id NonNulldelete; // expected-error {{property attributes 'nonnull' and 'weak' are mutually exclusive}}
87 @property(nonatomic, weak, nullable) id Nullabledelete; // do not warn
89 // strong cases.
90 @property(nonatomic, strong) id stdelegate; // Do not warn
91 @property(nonatomic, readonly) id stROdelegate; // Do not warn
92 @property(nonatomic, strong, nonnull) id stNonNulldelete; // Do not warn
93 @property(nonatomic, nullable) id stNullabledelete; // do not warn
94 @end
95 #pragma clang assume_nonnull end
97 @interface J: NSObject
98 @property(nonatomic, weak) id ddd;   // Do not warn, nullable is inferred.
99 @property(nonatomic, weak, nonnull) id delegate; // expected-error {{property attributes 'nonnull' and 'weak' are mutually exclusive}}
100 @property(nonatomic, weak, nonnull, readonly) id ROdelegate; // expected-error {{property attributes 'nonnull' and 'weak' are mutually exclusive}}
101 @end
103 @protocol P
104 @property(readonly, retain) id prop;
105 @end
107 __attribute__((objc_root_class))
108 @interface I2<P>
109 @end
111 @interface I2()
112 @property (readwrite) id prop;
113 @end
115 @implementation I2
116 @synthesize prop;
117 @end
119 // Verify that the all of the property declarations in inherited protocols are
120 // compatible when synthesing a property from a protocol.
122 @protocol CopyVsAssign1
123 @property (copy, nonatomic,  readonly) id prop; // expected-error {{property with attribute 'copy' was selected for synthesis}}
124 @end
125 @protocol CopyVsAssign2
126 @property (assign, nonatomic, readonly) id prop; // expected-note {{it could also be property without attribute 'copy' declared here}}
127 @end
129 @interface CopyVsAssign: Foo <CopyVsAssign1, CopyVsAssign2>
130 @end
131 @implementation CopyVsAssign
132 @synthesize prop; // expected-note {{property synthesized here}}
133 @end
135 @protocol RetainVsNonRetain1
136 @property (readonly) id prop; // expected-error {{property without attribute 'retain (or strong)' was selected for synthesis}}
137 @end
138 @protocol RetainVsNonRetain2
139 @property (retain, readonly) id prop; // expected-note {{it could also be property with attribute 'retain (or strong)' declared here}}
140 @end
142 @interface RetainVsNonRetain: Foo <RetainVsNonRetain1, RetainVsNonRetain2>
143 @end
144 @implementation RetainVsNonRetain
145 @synthesize prop; // expected-note {{property synthesized here}}
146 @end
148 @protocol AtomicVsNonatomic1
149 @property (copy, nonatomic, readonly) id prop; // expected-error {{property without attribute 'atomic' was selected for synthesis}}
150 @end
151 @protocol AtomicVsNonatomic2
152 @property (copy, atomic, readonly) id prop; // expected-note {{it could also be property with attribute 'atomic' declared here}}
153 @end
155 @interface AtomicVsNonAtomic: Foo <AtomicVsNonatomic1, AtomicVsNonatomic2>
156 @end
157 @implementation AtomicVsNonAtomic
158 @synthesize prop; // expected-note {{property synthesized here}}
159 @end
161 @protocol Getter1
162 @property (copy, readonly) id prop; // expected-error {{property with getter 'prop' was selected for synthesis}}
163 @end
164 @protocol Getter2
165 @property (copy, getter=x, readonly) id prop; // expected-note {{it could also be property with getter 'x' declared here}}
166 @end
168 @interface GetterVsGetter: Foo <Getter1, Getter2>
169 @end
170 @implementation GetterVsGetter
171 @synthesize prop; // expected-note {{property synthesized here}}
172 @end
174 @protocol Setter1
175 @property (copy, readonly) id prop;
176 @end
177 @protocol Setter2
178 @property (copy, setter=setp:, readwrite) id prop; // expected-error {{property with setter 'setp:' was selected for synthesis}}
179 @end
180 @protocol Setter3
181 @property (copy, readwrite) id prop; // expected-note {{it could also be property with setter 'setProp:' declared here}}
182 @end
184 @interface SetterVsSetter: Foo <Setter1, Setter2, Setter3>
185 @end
186 @implementation SetterVsSetter
187 @synthesize prop; // expected-note {{property synthesized here}}
188 @end
190 @protocol TypeVsAttribute1
191 @property (assign, atomic, readonly) int prop; // expected-error {{property of type 'int' was selected for synthesis}}
192 @end
193 @protocol TypeVsAttribute2
194 @property (assign, atomic, readonly) id prop; // expected-note {{it could also be property of type 'id' declared here}}
195 @end
196 @protocol TypeVsAttribute3
197 @property (copy, readonly) id prop; // expected-note {{it could also be property with attribute 'copy' declared here}}
198 @end
200 @interface TypeVsAttribute: Foo <TypeVsAttribute1, TypeVsAttribute2, TypeVsAttribute3>
201 @end
202 @implementation TypeVsAttribute
203 @synthesize prop; // expected-note {{property synthesized here}}
204 @end
206 @protocol TypeVsSetter1
207 @property (assign, nonatomic, readonly) int prop; // expected-note {{it could also be property of type 'int' declared here}}
208 @end
209 @protocol TypeVsSetter2
210 @property (assign, nonatomic, readonly) id prop; // ok
211 @end
212 @protocol TypeVsSetter3
213 @property (assign, nonatomic, readwrite) id prop; // expected-error {{property of type 'id' was selected for synthesis}}
214 @end
216 @interface TypeVsSetter: Foo <TypeVsSetter1, TypeVsSetter2, TypeVsSetter3>
217 @end
218 @implementation TypeVsSetter
219 @synthesize prop; // expected-note {{property synthesized here}}
220 @end
222 @protocol AutoStrongProp
224 @property (nonatomic, readonly) NSObject *prop;
226 @end
228 @protocol AutoStrongProp_Internal <AutoStrongProp>
230 // This property gets the 'strong' attribute automatically.
231 @property (nonatomic, readwrite) NSObject *prop;
233 @end
235 @interface SynthesizeWithImplicitStrongNoError : NSObject <AutoStrongProp>
236 @end
238 @interface SynthesizeWithImplicitStrongNoError () <AutoStrongProp_Internal>
240 @end
242 @implementation SynthesizeWithImplicitStrongNoError
244 // no error, 'strong' is implicit in the 'readwrite' property.
245 @synthesize prop = _prop;
247 @end
249 // Allow strong readwrite property and a readonly one.
250 @protocol StrongCollision
252 @property(strong) NSObject *p;
253 @property(copy) NSObject *p2;
255 // expected-error@+1 {{property with attribute 'retain (or strong)' was selected for synthesis}}
256 @property(strong, readwrite) NSObject *collision;
258 @end
260 @protocol ReadonlyCollision
262 @property(readonly) NSObject *p;
263 @property(readonly) NSObject *p2;
265 // expected-note@+1 {{it could also be property without attribute 'retain (or strong)' declared here}}
266 @property(readonly, weak) NSObject *collision;
268 @end
270 @interface StrongReadonlyCollision : NSObject <StrongCollision, ReadonlyCollision>
271 @end
273 @implementation StrongReadonlyCollision
275 // no error
276 @synthesize p = _p;
277 @synthesize p2 = _p2;
279 @synthesize collision = _collision; // expected-note {{property synthesized here}}
281 @end
283 // This used to crash because we'd temporarly store the weak attribute on the
284 // declaration specifier, then deallocate it when clearing the declarator.
285 id i1, __weak i2, i3;