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