150
|
1 // RUN: %clang_cc1 -verify -fsyntax-only -Wno-objc-root-class %s
|
|
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 }
|