1 // RUN: %clang_cc1 -fsyntax-only -verify -Wno-objc-root-class %s 2 3 /* 4 Conditions for warning: 5 1. the property is atomic 6 2. the current @implementation contains an @synthesize for the property 7 3. the current @implementation contains a hand-written setter XOR getter 8 4. the property is read-write 9 10 Cases marked WARN should warn one the following: 11 warning: Atomic property 'x' has a synthesized setter and a 12 manually-implemented getter, which may break atomicity. 13 warning: Atomic property 'x' has a synthesized getter and a 14 manually-implemented setter, which may break atomicity. 15 16 Cases not marked WARN only satisfy the indicated subset 17 of the conditions required to warn. 18 19 There should be 8 warnings. 20 */ 21 22 @interface Foo 23 { 24 /* 12 4 */ int GetSet; 25 /* WARN */ int Get; 26 /* WARN */ int Set; 27 /* 12 4 */ int None; 28 /* 2 4 */ int GetSet_Nonatomic; 29 /* 234 */ int Get_Nonatomic; 30 /* 234 */ int Set_Nonatomic; 31 /* 2 4 */ int None_Nonatomic; 32 33 /* 12 */ int GetSet_ReadOnly; 34 /* 123 */ int Get_ReadOnly; 35 /* 123 */ int Set_ReadOnly; 36 /* 12 */ int None_ReadOnly; 37 /* 2 */ int GetSet_Nonatomic_ReadOnly; 38 /* 23 */ int Get_Nonatomic_ReadOnly; 39 /* 23 */ int Set_Nonatomic_ReadOnly; 40 /* 2 */ int None_Nonatomic_ReadOnly; 41 42 /* 12 4 */ int GetSet_ReadWriteInExt; 43 /* WARN */ int Get_ReadWriteInExt; 44 /* WARN */ int Set_ReadWriteInExt; 45 /* 12 4 */ int None_ReadWriteInExt; 46 /* 2 4 */ int GetSet_Nonatomic_ReadWriteInExt; 47 /* 234 */ int Get_Nonatomic_ReadWriteInExt; 48 /* 234 */ int Set_Nonatomic_ReadWriteInExt; 49 /* 2 4 */ int None_Nonatomic_ReadWriteInExt; 50 51 52 /* 12 4 */ int GetSet_LateSynthesize; 53 /* WARN */ int Get_LateSynthesize; 54 /* WARN */ int Set_LateSynthesize; 55 /* 12 4 */ int None_LateSynthesize; 56 /* 2 4 */ int GetSet_Nonatomic_LateSynthesize; 57 /* 234 */ int Get_Nonatomic_LateSynthesize; 58 /* 234 */ int Set_Nonatomic_LateSynthesize; 59 /* 2 4 */ int None_Nonatomic_LateSynthesize; 60 61 /* 12 */ int GetSet_ReadOnly_LateSynthesize; 62 /* 123 */ int Get_ReadOnly_LateSynthesize; 63 /* 123 */ int Set_ReadOnly_LateSynthesize; 64 /* 12 */ int None_ReadOnly_LateSynthesize; 65 /* 2 */ int GetSet_Nonatomic_ReadOnly_LateSynthesize; 66 /* 23 */ int Get_Nonatomic_ReadOnly_LateSynthesize; 67 /* 23 */ int Set_Nonatomic_ReadOnly_LateSynthesize; 68 /* 2 */ int None_Nonatomic_ReadOnly_LateSynthesize; 69 70 /* 12 4 */ int GetSet_ReadWriteInExt_LateSynthesize; 71 /* WARN */ int Get_ReadWriteInExt_LateSynthesize; 72 /* WARN */ int Set_ReadWriteInExt_LateSynthesize; 73 /* 12 4 */ int None_ReadWriteInExt_LateSynthesize; 74 /* 2 4 */ int GetSet_Nonatomic_ReadWriteInExt_LateSynthesize; 75 /* 234 */ int Get_Nonatomic_ReadWriteInExt_LateSynthesize; 76 /* 234 */ int Set_Nonatomic_ReadWriteInExt_LateSynthesize; 77 /* 2 4 */ int None_Nonatomic_ReadWriteInExt_LateSynthesize; 78 79 80 /* 1 4 */ int GetSet_NoSynthesize; 81 /* 1 34 */ int Get_NoSynthesize; 82 /* 1 34 */ int Set_NoSynthesize; 83 /* 1 4 */ int None_NoSynthesize; 84 /* 4 */ int GetSet_Nonatomic_NoSynthesize; 85 /* 34 */ int Get_Nonatomic_NoSynthesize; 86 /* 34 */ int Set_Nonatomic_NoSynthesize; 87 /* 4 */ int None_Nonatomic_NoSynthesize; 88 89 /* 1 */ int GetSet_ReadOnly_NoSynthesize; 90 /* 1 3 */ int Get_ReadOnly_NoSynthesize; 91 /* 1 3 */ int Set_ReadOnly_NoSynthesize; 92 /* 1 */ int None_ReadOnly_NoSynthesize; 93 /* */ int GetSet_Nonatomic_ReadOnly_NoSynthesize; 94 /* 3 */ int Get_Nonatomic_ReadOnly_NoSynthesize; 95 /* 3 */ int Set_Nonatomic_ReadOnly_NoSynthesize; 96 /* */ int None_Nonatomic_ReadOnly_NoSynthesize; 97 98 /* 1 4 */ int GetSet_ReadWriteInExt_NoSynthesize; 99 /* 1 34 */ int Get_ReadWriteInExt_NoSynthesize; 100 /* 1 34 */ int Set_ReadWriteInExt_NoSynthesize; 101 /* 1 4 */ int None_ReadWriteInExt_NoSynthesize; 102 /* 4 */ int GetSet_Nonatomic_ReadWriteInExt_NoSynthesize; 103 /* 34 */ int Get_Nonatomic_ReadWriteInExt_NoSynthesize; 104 /* 34 */ int Set_Nonatomic_ReadWriteInExt_NoSynthesize; 105 /* 4 */ int None_Nonatomic_ReadWriteInExt_NoSynthesize; 106 } 107 108 // read-write - might warn 109 @property int GetSet; 110 @property int Get; // expected-note {{property declared here}} \ 111 // expected-note {{setter and getter must both be synthesized}} 112 @property int Set; // expected-note {{property declared here}} \ 113 // expected-note {{setter and getter must both be synthesized}} 114 @property int None; 115 @property(nonatomic) int GetSet_Nonatomic; 116 @property(nonatomic) int Get_Nonatomic; 117 @property(nonatomic) int Set_Nonatomic; 118 @property(nonatomic) int None_Nonatomic; 119 120 // read-only - must not warn 121 @property(readonly) int GetSet_ReadOnly; 122 @property(readonly) int Get_ReadOnly; 123 @property(readonly) int Set_ReadOnly; 124 @property(readonly) int None_ReadOnly; 125 @property(nonatomic,readonly) int GetSet_Nonatomic_ReadOnly; 126 @property(nonatomic,readonly) int Get_Nonatomic_ReadOnly; 127 @property(nonatomic,readonly) int Set_Nonatomic_ReadOnly; 128 @property(nonatomic,readonly) int None_Nonatomic_ReadOnly; 129 130 // read-only in class, read-write in class extension - might warn 131 @property(readonly) int GetSet_ReadWriteInExt; 132 @property(readonly) int Get_ReadWriteInExt; 133 @property(readonly) int Set_ReadWriteInExt; 134 @property(readonly) int None_ReadWriteInExt; 135 @property(nonatomic,readonly) int GetSet_Nonatomic_ReadWriteInExt; 136 @property(nonatomic,readonly) int Get_Nonatomic_ReadWriteInExt; 137 @property(nonatomic,readonly) int Set_Nonatomic_ReadWriteInExt; 138 @property(nonatomic,readonly) int None_Nonatomic_ReadWriteInExt; 139 140 141 // same as above, but @synthesize follows the hand-written methods - might warn 142 @property int GetSet_LateSynthesize; 143 @property int Get_LateSynthesize; // expected-note {{property declared here}} \ 144 // expected-note {{setter and getter must both be synthesized}} 145 @property int Set_LateSynthesize; // expected-note {{property declared here}} \ 146 // expected-note {{setter and getter must both be synthesized}} 147 @property int None_LateSynthesize; 148 @property(nonatomic) int GetSet_Nonatomic_LateSynthesize; 149 @property(nonatomic) int Get_Nonatomic_LateSynthesize; 150 @property(nonatomic) int Set_Nonatomic_LateSynthesize; 151 @property(nonatomic) int None_Nonatomic_LateSynthesize; 152 153 @property(readonly) int GetSet_ReadOnly_LateSynthesize; 154 @property(readonly) int Get_ReadOnly_LateSynthesize; 155 @property(readonly) int Set_ReadOnly_LateSynthesize; 156 @property(readonly) int None_ReadOnly_LateSynthesize; 157 @property(nonatomic,readonly) int GetSet_Nonatomic_ReadOnly_LateSynthesize; 158 @property(nonatomic,readonly) int Get_Nonatomic_ReadOnly_LateSynthesize; 159 @property(nonatomic,readonly) int Set_Nonatomic_ReadOnly_LateSynthesize; 160 @property(nonatomic,readonly) int None_Nonatomic_ReadOnly_LateSynthesize; 161 162 @property(readonly) int GetSet_ReadWriteInExt_LateSynthesize; 163 @property(readonly) int Get_ReadWriteInExt_LateSynthesize; 164 @property(readonly) int Set_ReadWriteInExt_LateSynthesize; 165 @property(readonly) int None_ReadWriteInExt_LateSynthesize; 166 @property(nonatomic,readonly) int GetSet_Nonatomic_ReadWriteInExt_LateSynthesize; 167 @property(nonatomic,readonly) int Get_Nonatomic_ReadWriteInExt_LateSynthesize; 168 @property(nonatomic,readonly) int Set_Nonatomic_ReadWriteInExt_LateSynthesize; 169 @property(nonatomic,readonly) int None_Nonatomic_ReadWriteInExt_LateSynthesize; 170 171 172 // same as above, but with no @synthesize - must not warn 173 @property int GetSet_NoSynthesize; 174 @property int Get_NoSynthesize; 175 @property int Set_NoSynthesize; 176 @property int None_NoSynthesize; 177 @property(nonatomic) int GetSet_Nonatomic_NoSynthesize; 178 @property(nonatomic) int Get_Nonatomic_NoSynthesize; 179 @property(nonatomic) int Set_Nonatomic_NoSynthesize; 180 @property(nonatomic) int None_Nonatomic_NoSynthesize; 181 182 @property(readonly) int GetSet_ReadOnly_NoSynthesize; 183 @property(readonly) int Get_ReadOnly_NoSynthesize; 184 @property(readonly) int Set_ReadOnly_NoSynthesize; 185 @property(readonly) int None_ReadOnly_NoSynthesize; 186 @property(nonatomic,readonly) int GetSet_Nonatomic_ReadOnly_NoSynthesize; 187 @property(nonatomic,readonly) int Get_Nonatomic_ReadOnly_NoSynthesize; 188 @property(nonatomic,readonly) int Set_Nonatomic_ReadOnly_NoSynthesize; 189 @property(nonatomic,readonly) int None_Nonatomic_ReadOnly_NoSynthesize; 190 191 @property(readonly) int GetSet_ReadWriteInExt_NoSynthesize; 192 @property(readonly) int Get_ReadWriteInExt_NoSynthesize; 193 @property(readonly) int Set_ReadWriteInExt_NoSynthesize; 194 @property(readonly) int None_ReadWriteInExt_NoSynthesize; 195 @property(nonatomic,readonly) int GetSet_Nonatomic_ReadWriteInExt_NoSynthesize; 196 @property(nonatomic,readonly) int Get_Nonatomic_ReadWriteInExt_NoSynthesize; 197 @property(nonatomic,readonly) int Set_Nonatomic_ReadWriteInExt_NoSynthesize; 198 @property(nonatomic,readonly) int None_Nonatomic_ReadWriteInExt_NoSynthesize; 199 200 @end 201 202 203 @interface Foo () 204 205 @property(readwrite) int GetSet_ReadWriteInExt; 206 @property(readwrite) int Get_ReadWriteInExt; // expected-note {{property declared here}} \ 207 // expected-note {{setter and getter must both be synthesized}} 208 @property(readwrite) int Set_ReadWriteInExt; // expected-note {{property declared here}} \ 209 // expected-note {{setter and getter must both be synthesized}} 210 @property(readwrite) int None_ReadWriteInExt; 211 @property(nonatomic,readwrite) int GetSet_Nonatomic_ReadWriteInExt; 212 @property(nonatomic,readwrite) int Get_Nonatomic_ReadWriteInExt; 213 @property(nonatomic,readwrite) int Set_Nonatomic_ReadWriteInExt; 214 @property(nonatomic,readwrite) int None_Nonatomic_ReadWriteInExt; 215 216 @property(readwrite) int GetSet_ReadWriteInExt_LateSynthesize; 217 @property(readwrite) int Get_ReadWriteInExt_LateSynthesize; // expected-note {{property declared here}} \ 218 // expected-note {{setter and getter must both be synthesized}} 219 @property(readwrite) int Set_ReadWriteInExt_LateSynthesize; // expected-note {{property declared here}} \ 220 // expected-note {{setter and getter must both be synthesized}} 221 @property(readwrite) int None_ReadWriteInExt_LateSynthesize; 222 @property(nonatomic,readwrite) int GetSet_Nonatomic_ReadWriteInExt_LateSynthesize; 223 @property(nonatomic,readwrite) int Get_Nonatomic_ReadWriteInExt_LateSynthesize; 224 @property(nonatomic,readwrite) int Set_Nonatomic_ReadWriteInExt_LateSynthesize; 225 @property(nonatomic,readwrite) int None_Nonatomic_ReadWriteInExt_LateSynthesize; 226 227 @property(readwrite) int GetSet_ReadWriteInExt_NoSynthesize; 228 @property(readwrite) int Get_ReadWriteInExt_NoSynthesize; 229 @property(readwrite) int Set_ReadWriteInExt_NoSynthesize; 230 @property(readwrite) int None_ReadWriteInExt_NoSynthesize; 231 @property(nonatomic,readwrite) int GetSet_Nonatomic_ReadWriteInExt_NoSynthesize; 232 @property(nonatomic,readwrite) int Get_Nonatomic_ReadWriteInExt_NoSynthesize; 233 @property(nonatomic,readwrite) int Set_Nonatomic_ReadWriteInExt_NoSynthesize; 234 @property(nonatomic,readwrite) int None_Nonatomic_ReadWriteInExt_NoSynthesize; 235 236 @end 237 238 @implementation Foo 239 240 @synthesize GetSet, Get, Set, None, GetSet_Nonatomic, Get_Nonatomic, Set_Nonatomic, None_Nonatomic; 241 @synthesize GetSet_ReadOnly, Get_ReadOnly, Set_ReadOnly, None_ReadOnly, GetSet_Nonatomic_ReadOnly, Get_Nonatomic_ReadOnly, Set_Nonatomic_ReadOnly, None_Nonatomic_ReadOnly; 242 @synthesize GetSet_ReadWriteInExt, Get_ReadWriteInExt, Set_ReadWriteInExt, None_ReadWriteInExt, GetSet_Nonatomic_ReadWriteInExt, Get_Nonatomic_ReadWriteInExt, Set_Nonatomic_ReadWriteInExt, None_Nonatomic_ReadWriteInExt; 243 244 #define GET(x) \ 245 -(int) x { return self->x; } 246 #define SET(x) \ 247 -(void) set##x:(int)value { self->x = value; } 248 249 GET(GetSet) 250 SET(GetSet) 251 GET(Get) // expected-warning {{writable atomic property 'Get' cannot pair a synthesized setter with a user defined getter}} 252 SET(Set) // expected-warning {{writable atomic property 'Set' cannot pair a synthesized getter with a user defined setter}} 253 GET(GetSet_Nonatomic) 254 SET(GetSet_Nonatomic) 255 GET(Get_Nonatomic) 256 SET(Set_Nonatomic) 257 258 GET(GetSet_ReadOnly) 259 SET(GetSet_ReadOnly) 260 GET(Get_ReadOnly) 261 SET(Set_ReadOnly) 262 GET(GetSet_Nonatomic_ReadOnly) 263 SET(GetSet_Nonatomic_ReadOnly) 264 GET(Get_Nonatomic_ReadOnly) 265 SET(Set_Nonatomic_ReadOnly) 266 267 GET(GetSet_ReadWriteInExt) 268 SET(GetSet_ReadWriteInExt) 269 GET(Get_ReadWriteInExt) // expected-warning {{writable atomic property 'Get_ReadWriteInExt' cannot pair a synthesized setter with a user defined getter}} 270 SET(Set_ReadWriteInExt) // expected-warning {{writable atomic property 'Set_ReadWriteInExt' cannot pair a synthesized getter with a user defined setter}} 271 GET(GetSet_Nonatomic_ReadWriteInExt) 272 SET(GetSet_Nonatomic_ReadWriteInExt) 273 GET(Get_Nonatomic_ReadWriteInExt) 274 SET(Set_Nonatomic_ReadWriteInExt) 275 276 277 GET(GetSet_LateSynthesize) 278 SET(GetSet_LateSynthesize) 279 GET(Get_LateSynthesize) // expected-warning {{writable atomic property 'Get_LateSynthesize' cannot pair a synthesized setter with a user defined getter}} 280 SET(Set_LateSynthesize) // expected-warning {{writable atomic property 'Set_LateSynthesize' cannot pair a synthesized getter with a user defined setter}} 281 GET(GetSet_Nonatomic_LateSynthesize) 282 SET(GetSet_Nonatomic_LateSynthesize) 283 GET(Get_Nonatomic_LateSynthesize) 284 SET(Set_Nonatomic_LateSynthesize) 285 286 GET(GetSet_ReadOnly_LateSynthesize) 287 SET(GetSet_ReadOnly_LateSynthesize) 288 GET(Get_ReadOnly_LateSynthesize) 289 SET(Set_ReadOnly_LateSynthesize) 290 GET(GetSet_Nonatomic_ReadOnly_LateSynthesize) 291 SET(GetSet_Nonatomic_ReadOnly_LateSynthesize) 292 GET(Get_Nonatomic_ReadOnly_LateSynthesize) 293 SET(Set_Nonatomic_ReadOnly_LateSynthesize) 294 295 GET(GetSet_ReadWriteInExt_LateSynthesize) 296 SET(GetSet_ReadWriteInExt_LateSynthesize) 297 GET(Get_ReadWriteInExt_LateSynthesize) // expected-warning {{writable atomic property 'Get_ReadWriteInExt_LateSynthesize' cannot pair a synthesized setter with a user defined getter}} 298 SET(Set_ReadWriteInExt_LateSynthesize) // expected-warning {{writable atomic property 'Set_ReadWriteInExt_LateSynthesize' cannot pair a synthesized getter with a user defined setter}} 299 GET(GetSet_Nonatomic_ReadWriteInExt_LateSynthesize) 300 SET(GetSet_Nonatomic_ReadWriteInExt_LateSynthesize) 301 GET(Get_Nonatomic_ReadWriteInExt_LateSynthesize) 302 SET(Set_Nonatomic_ReadWriteInExt_LateSynthesize) 303 304 305 GET(GetSet_NoSynthesize) 306 SET(GetSet_NoSynthesize) 307 GET(Get_NoSynthesize) 308 SET(Set_NoSynthesize) 309 GET(GetSet_Nonatomic_NoSynthesize) 310 SET(GetSet_Nonatomic_NoSynthesize) 311 GET(Get_Nonatomic_NoSynthesize) 312 SET(Set_Nonatomic_NoSynthesize) 313 314 GET(GetSet_ReadOnly_NoSynthesize) 315 SET(GetSet_ReadOnly_NoSynthesize) 316 GET(Get_ReadOnly_NoSynthesize) 317 SET(Set_ReadOnly_NoSynthesize) 318 GET(GetSet_Nonatomic_ReadOnly_NoSynthesize) 319 SET(GetSet_Nonatomic_ReadOnly_NoSynthesize) 320 GET(Get_Nonatomic_ReadOnly_NoSynthesize) 321 SET(Set_Nonatomic_ReadOnly_NoSynthesize) 322 323 GET(GetSet_ReadWriteInExt_NoSynthesize) 324 SET(GetSet_ReadWriteInExt_NoSynthesize) 325 GET(Get_ReadWriteInExt_NoSynthesize) 326 SET(Set_ReadWriteInExt_NoSynthesize) 327 GET(GetSet_Nonatomic_ReadWriteInExt_NoSynthesize) 328 SET(GetSet_Nonatomic_ReadWriteInExt_NoSynthesize) 329 GET(Get_Nonatomic_ReadWriteInExt_NoSynthesize) 330 SET(Set_Nonatomic_ReadWriteInExt_NoSynthesize) 331 332 333 // late synthesize - follows getter/setter implementations 334 335 @synthesize GetSet_LateSynthesize, Get_LateSynthesize, Set_LateSynthesize, None_LateSynthesize, GetSet_Nonatomic_LateSynthesize, Get_Nonatomic_LateSynthesize, Set_Nonatomic_LateSynthesize, None_Nonatomic_LateSynthesize; 336 @synthesize GetSet_ReadOnly_LateSynthesize, Get_ReadOnly_LateSynthesize, Set_ReadOnly_LateSynthesize, None_ReadOnly_LateSynthesize, GetSet_Nonatomic_ReadOnly_LateSynthesize, Get_Nonatomic_ReadOnly_LateSynthesize, Set_Nonatomic_ReadOnly_LateSynthesize, None_Nonatomic_ReadOnly_LateSynthesize; 337 @synthesize GetSet_ReadWriteInExt_LateSynthesize, Get_ReadWriteInExt_LateSynthesize, Set_ReadWriteInExt_LateSynthesize, None_ReadWriteInExt_LateSynthesize, GetSet_Nonatomic_ReadWriteInExt_LateSynthesize, Get_Nonatomic_ReadWriteInExt_LateSynthesize, Set_Nonatomic_ReadWriteInExt_LateSynthesize, None_Nonatomic_ReadWriteInExt_LateSynthesize; 338 339 // no synthesize - use dynamic instead 340 341 @dynamic GetSet_NoSynthesize, Get_NoSynthesize, Set_NoSynthesize, None_NoSynthesize, GetSet_Nonatomic_NoSynthesize, Get_Nonatomic_NoSynthesize, Set_Nonatomic_NoSynthesize, None_Nonatomic_NoSynthesize; 342 @dynamic GetSet_ReadOnly_NoSynthesize, Get_ReadOnly_NoSynthesize, Set_ReadOnly_NoSynthesize, None_ReadOnly_NoSynthesize, GetSet_Nonatomic_ReadOnly_NoSynthesize, Get_Nonatomic_ReadOnly_NoSynthesize, Set_Nonatomic_ReadOnly_NoSynthesize, None_Nonatomic_ReadOnly_NoSynthesize; 343 @dynamic GetSet_ReadWriteInExt_NoSynthesize, Get_ReadWriteInExt_NoSynthesize, Set_ReadWriteInExt_NoSynthesize, None_ReadWriteInExt_NoSynthesize, GetSet_Nonatomic_ReadWriteInExt_NoSynthesize, Get_Nonatomic_ReadWriteInExt_NoSynthesize, Set_Nonatomic_ReadWriteInExt_NoSynthesize, None_Nonatomic_ReadWriteInExt_NoSynthesize; 344 345 @end 346 347 /* 348 // the following method should cause a warning along the lines of 349 // :warning: Atomic property 'x' cannot pair a synthesized setter/getter with a manually implemented setter/getter 350 - (void) setX: (int) aValue 351 { 352 x = aValue; 353 } 354 355 // no warning 'cause this is nonatomic 356 - (void) setY: (int) aValue 357 { 358 y = aValue; 359 } 360 361 // the following method should cause a warning along the lines of 362 // :warning: Atomic property 'x' cannot pair a synthesized setter/getter with a manually implemented setter/getter 363 - (int) j 364 { 365 return j; 366 } 367 368 // no warning 'cause this is nonatomic 369 - (int) k 370 { 371 return k; 372 } 373 @end 374 */ 375 int main (int argc, const char * argv[]) { 376 return 0; 377 } 378