1 | // RUN: %clang_cc1 -x objective-c -fsyntax-only -verify -Wno-objc-root-class %s |
2 | // RUN: %clang_cc1 -x objective-c++ -fsyntax-only -verify -Wno-objc-root-class %s |
3 | |
4 | #if __has_attribute(objc_requires_property_definitions) |
5 | __attribute ((objc_requires_property_definitions)) |
6 | #endif |
7 | @interface NoAuto // expected-note 2 {{class with specified objc_requires_property_definitions attribute is declared here}} |
8 | @property int NoAutoProp; // expected-note 2 {{property declared here}} |
9 | @end |
10 | |
11 | @implementation NoAuto // expected-warning {{property 'NoAutoProp' requires method 'NoAutoProp' to be defined}} \ |
12 | // expected-warning {{property 'NoAutoProp' requires method 'setNoAutoProp:'}} |
13 | @end |
14 | |
15 | __attribute ((objc_requires_property_definitions)) // redundant, just for testing |
16 | @interface Sub : NoAuto // expected-note 3 {{class with specified objc_requires_property_definitions attribute is declared here}} |
17 | @property (copy) id SubProperty; // expected-note 2 {{property declared here}} |
18 | @end |
19 | |
20 | @implementation Sub // expected-warning {{property 'SubProperty' requires method 'SubProperty' to be defined}} \ |
21 | // expected-warning {{property 'SubProperty' requires method 'setSubProperty:' to be defined}} |
22 | @end |
23 | |
24 | @interface Deep : Sub |
25 | @property (copy) id DeepProperty; |
26 | @property (copy) id DeepSynthProperty; |
27 | @property (copy) id DeepMustSynthProperty; // expected-note {{property declared here}} |
28 | @end |
29 | |
30 | @implementation Deep // expected-warning {{property 'DeepMustSynthProperty' requires method 'setDeepMustSynthProperty:' to be defined}} |
31 | @dynamic DeepProperty; |
32 | @synthesize DeepSynthProperty; |
33 | - (id) DeepMustSynthProperty { return 0; } |
34 | @end |
35 | |
36 | __attribute ((objc_requires_property_definitions)) // expected-error {{'objc_requires_property_definitions' attribute only applies to Objective-C interfaces}} |
37 | @interface Deep(CAT) |
38 | @end |
39 | |
40 | __attribute ((objc_requires_property_definitions)) // expected-error {{'objc_requires_property_definitions' attribute only applies to Objective-C interfaces}} |
41 | @protocol P @end |
42 | |
43 | // rdar://13388503 |
44 | @interface NSObject @end |
45 | @protocol Foo |
46 | @property (readonly) char isFoo; // expected-note {{property declared here}} |
47 | @property (readonly) char isNotFree; // expected-note {{property declared here}} |
48 | @end |
49 | |
50 | @interface Bar : NSObject <Foo> |
51 | @end |
52 | |
53 | @implementation Bar |
54 | - (char)isFoo { |
55 | return 0; |
56 | } |
57 | - (char)isNotFree { |
58 | return 0; |
59 | } |
60 | @end |
61 | |
62 | @interface Baz : Bar |
63 | @end |
64 | |
65 | @interface Baz () |
66 | @property (readwrite) char isFoo; // expected-warning {{auto property synthesis will not synthesize property 'isFoo' because it is 'readwrite' but it will be synthesized 'readonly' via another property}} |
67 | @property char Property1; // expected-warning {{auto property synthesis will not synthesize property 'Property1' because it cannot share an ivar with another synthesized property}} |
68 | @property char Property2; |
69 | @property (readwrite) char isNotFree; // expected-warning {{auto property synthesis will not synthesize property 'isNotFree'}} |
70 | @end |
71 | |
72 | @implementation Baz { // expected-note {{detected while default synthesizing properties in class implementation}} |
73 | char _isFoo; |
74 | char _isNotFree; |
75 | } |
76 | @synthesize Property2 = Property1; // expected-note {{property synthesized here}} |
77 | |
78 | - (void) setIsNotFree : (char)Arg { |
79 | _isNotFree = Arg; |
80 | } |
81 | |
82 | @end |
83 | |
84 | // More test where such warnings should not be issued. |
85 | @protocol MyProtocol |
86 | -(void)setProp1:(id)x; |
87 | @end |
88 | |
89 | @protocol P1 <MyProtocol> |
90 | @end |
91 | |
92 | @interface B |
93 | @property (readonly) id prop; // expected-note {{property declared here}} |
94 | @property (readonly) id prop1; // expected-note {{property declared here}} |
95 | @property (readonly) id prop2; // expected-note {{property declared here}} |
96 | @end |
97 | |
98 | @interface B() |
99 | -(void)setProp:(id)x; |
100 | @end |
101 | |
102 | @interface B(cat) |
103 | @property (readwrite) id prop2; |
104 | @end |
105 | |
106 | @interface S : B<P1> |
107 | @property (assign,readwrite) id prop; // expected-warning {{auto property synthesis will not synthesize property 'prop'}} |
108 | @property (assign,readwrite) id prop1; // expected-warning {{auto property synthesis will not synthesize property 'prop1'}} |
109 | @property (assign,readwrite) id prop2; // expected-warning {{auto property synthesis will not synthesize property 'prop2'}} |
110 | @end |
111 | |
112 | @implementation S // expected-note 3 {{detected while default synthesizing properties in class implementation}} |
113 | @end |
114 | |
115 | // rdar://14085456 |
116 | // No warning must be issued in this test. |
117 | @interface ParentObject |
118 | @end |
119 | |
120 | @protocol TestObject |
121 | @property (readonly) int six; |
122 | @end |
123 | |
124 | @interface TestObject : ParentObject <TestObject> |
125 | @property int six; |
126 | @end |
127 | |
128 | @implementation TestObject |
129 | @synthesize six; |
130 | @end |
131 | |
132 | // rdar://14094682 |
133 | // no warning in this test |
134 | @interface ISAChallenge : NSObject { |
135 | } |
136 | |
137 | @property (assign, readonly) int failureCount; |
138 | @end |
139 | |
140 | @interface ISSAChallenge : ISAChallenge { |
141 | int _failureCount; |
142 | } |
143 | @property (assign, readwrite) int failureCount; |
144 | @end |
145 | |
146 | @implementation ISAChallenge |
147 | - (int)failureCount { |
148 | return 0; |
149 | } |
150 | @end |
151 | |
152 | @implementation ISSAChallenge |
153 | |
154 | @synthesize failureCount = _failureCount; |
155 | @end |
156 | |
157 | __attribute ((objc_requires_property_definitions(1))) // expected-error {{'objc_requires_property_definitions' attribute takes no arguments}} |
158 | @interface I1 |
159 | @end |
160 | |
161 | // rdar://15051465 |
162 | @protocol SubFooling |
163 | @property(nonatomic, readonly) id hoho; // expected-note 2 {{property declared here}} |
164 | @end |
165 | |
166 | @protocol Fooing<SubFooling> |
167 | @property(nonatomic, readonly) id muahahaha; // expected-note 2 {{property declared here}} |
168 | @end |
169 | |
170 | typedef NSObject<Fooing> FooObject; |
171 | |
172 | @interface Okay : NSObject<Fooing> |
173 | @end |
174 | |
175 | @implementation Okay // expected-warning {{auto property synthesis will not synthesize property 'muahahaha' declared in protocol 'Fooing'}} expected-warning {{auto property synthesis will not synthesize property 'hoho' declared in protocol 'SubFooling'}} |
176 | @end // expected-note 2 {{add a '@synthesize' directive}} |
177 | |
178 | @interface Fail : FooObject |
179 | @end |
180 | |
181 | @implementation Fail // expected-warning {{auto property synthesis will not synthesize property 'muahahaha' declared in protocol 'Fooing'}} expected-warning {{auto property synthesis will not synthesize property 'hoho' declared in protocol 'SubFooling'}} |
182 | @end // expected-note 2 {{add a '@synthesize' directive}} |
183 | |
184 | // rdar://16089191 |
185 | @class NSURL; |
186 | |
187 | @interface Root |
188 | - (void)setFileURL : (NSURL *) arg; |
189 | - (void)setFile : (NSURL *) arg; |
190 | - (NSURL *)fileSys; |
191 | - (void)setFileSys : (NSURL *) arg; |
192 | - (NSURL *)fileKerl; |
193 | @end |
194 | |
195 | @interface SuperClass : Root |
196 | - (NSURL *)fileURL; |
197 | - (NSURL *)file; |
198 | - (NSURL *)fileLog; |
199 | - (void)setFileLog : (NSURL *) arg; |
200 | - (void)setFileKerl : (NSURL *) arg; |
201 | @end |
202 | |
203 | @protocol r16089191Protocol |
204 | @property (readonly) NSURL *fileURL; |
205 | @property (copy) NSURL *file; |
206 | @property (copy) NSURL *fileSys; |
207 | @property (copy) NSURL *fileLog; |
208 | @property (copy) NSURL *fileKerl; |
209 | @end |
210 | |
211 | @interface SubClass : SuperClass <r16089191Protocol> |
212 | @end |
213 | |
214 | @implementation SubClass |
215 | @end |
216 | |