| // RUN: %clang_cc1 %s -verify -fsyntax-only |
| |
| void abort(void); |
| |
| @interface Subclass |
| + (int)magicNumber; |
| + (void)setMagicNumber:(int)value; |
| + (void)setFakeSetterNumber:(int)value; |
| @end |
| |
| @implementation Subclass |
| int _magicNumber = 0; |
| + (int)magicNumber { |
| return _magicNumber; |
| } |
| |
| + (void)setMagicNumber:(int)value { |
| _magicNumber = value; |
| } |
| |
| + (void)setFakeSetterNumber:(int)value { |
| _magicNumber = value; |
| } |
| |
| + (void) classMeth |
| { |
| self.magicNumber = 10; |
| if (self.magicNumber != 10) |
| abort (); |
| } |
| @end |
| |
| int main (void) { |
| |
| int a; |
| Subclass.magicNumber = 2 /*[Subclass setMagicNumber:2]*/; |
| if (Subclass.magicNumber != 0) |
| abort (); |
| if (Subclass.magicNumber != 2) |
| abort (); |
| Subclass.magicNumber += 3; |
| if (Subclass.magicNumber != 5) |
| abort (); |
| Subclass.magicNumber -= 5; |
| if (Subclass.magicNumber != 0) |
| abort (); |
| /* We only have a setter in the following case. */ |
| Subclass.fakeSetterNumber = 123; |
| |
| /* We read it using the other getter. */ |
| if (Subclass.magicNumber != 123) |
| abort (); |
| Subclass.fakeSetterNumber = Subclass.magicNumber; |
| if (Subclass.magicNumber != 123) |
| abort (); |
| |
| Subclass.fakeSetterNumberX = 123; // expected-error{{property 'fakeSetterNumberX' not found on object of type 'Subclass'}} |
| |
| /* Test class methods using the new syntax. */ |
| [Subclass classMeth]; |
| return 0; |
| } |