|  | // 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; | 
|  | } |