1 // RUN: %clang_cc1 %s -verify -fsyntax-only 2 3 void abort(void); 4 5 @interface Subclass 6 + (int)magicNumber; 7 + (void)setMagicNumber:(int)value; 8 + (void)setFakeSetterNumber:(int)value; 9 @end 10 11 @implementation Subclass 12 int _magicNumber = 0; 13 + (int)magicNumber { 14 return _magicNumber; 15 } 16 17 + (void)setMagicNumber:(int)value { 18 _magicNumber = value; 19 } 20 21 + (void)setFakeSetterNumber:(int)value { 22 _magicNumber = value; 23 } 24 25 + (void) classMeth 26 { 27 self.magicNumber = 10; 28 if (self.magicNumber != 10) 29 abort (); 30 } 31 @end 32 33 int main (void) { 34 35 int a; 36 Subclass.magicNumber = 2 /*[Subclass setMagicNumber:2]*/; 37 if (Subclass.magicNumber != 0) 38 abort (); 39 if (Subclass.magicNumber != 2) 40 abort (); 41 Subclass.magicNumber += 3; 42 if (Subclass.magicNumber != 5) 43 abort (); 44 Subclass.magicNumber -= 5; 45 if (Subclass.magicNumber != 0) 46 abort (); 47 /* We only have a setter in the following case. */ 48 Subclass.fakeSetterNumber = 123; 49 50 /* We read it using the other getter. */ 51 if (Subclass.magicNumber != 123) 52 abort (); 53 Subclass.fakeSetterNumber = Subclass.magicNumber; 54 if (Subclass.magicNumber != 123) 55 abort (); 56 57 Subclass.fakeSetterNumberX = 123; // expected-error{{property 'fakeSetterNumberX' not found on object of type 'Subclass'}} 58 59 /* Test class methods using the new syntax. */ 60 [Subclass classMeth]; 61 return 0; 62 } 63