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)) 37 @interface Deep(CAT) // expected-error {{attributes may not be specified on a category}} 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 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 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