xref: /aosp_15_r20/external/clang/test/SemaObjC/default-synthesize-2.m (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li// RUN: %clang_cc1 -x objective-c -fsyntax-only -verify -Wno-objc-root-class %s
2*67e74705SXin Li// RUN: %clang_cc1 -x objective-c++ -fsyntax-only -verify -Wno-objc-root-class %s
3*67e74705SXin Li// rdar://8843851
4*67e74705SXin Li
5*67e74705SXin Li@interface StopAccessingIvarsDirectlyExample
6*67e74705SXin Li@property(strong) id name, rank, serialNumber;
7*67e74705SXin Li@end
8*67e74705SXin Li
9*67e74705SXin Li@implementation StopAccessingIvarsDirectlyExample
10*67e74705SXin Li
11*67e74705SXin Li- (void)identifyYourSelf {
12*67e74705SXin Li    if (self.name && self.rank && self.serialNumber)
13*67e74705SXin Li      self.name = 0;
14*67e74705SXin Li}
15*67e74705SXin Li
16*67e74705SXin Li// @synthesize name, rank, serialNumber;
17*67e74705SXin Li// default synthesis allows direct access to property ivars.
18*67e74705SXin Li- (id)init {
19*67e74705SXin Li        _name = _rank = _serialNumber = 0;
20*67e74705SXin Li	return self;
21*67e74705SXin Li}
22*67e74705SXin Li
23*67e74705SXin Li- (void)dealloc {
24*67e74705SXin Li}
25*67e74705SXin Li@end
26*67e74705SXin Li
27*67e74705SXin Li
28*67e74705SXin Li// Test2
29*67e74705SXin Li@interface Test2
30*67e74705SXin Li@property(strong, nonatomic) id object;
31*67e74705SXin Li@end
32*67e74705SXin Li
33*67e74705SXin Li// object has user declared setter/getter so it won't be
34*67e74705SXin Li// default synthesized; thus causing user error.
35*67e74705SXin Li@implementation Test2
36*67e74705SXin Li- (id) bar { return object; } // expected-error {{use of undeclared identifier 'object'}}
37*67e74705SXin Li- (void)setObject:(id)newObject {}
38*67e74705SXin Li- (id)object { return 0; }
39*67e74705SXin Li@end
40*67e74705SXin Li
41*67e74705SXin Li// Test3
42*67e74705SXin Li@interface Test3
43*67e74705SXin Li{
44*67e74705SXin Li  id uid;  // expected-note {{instance variable is declared here}}
45*67e74705SXin Li}
46*67e74705SXin Li@property (readwrite, assign) id uid;  // expected-note {{property declared here}}
47*67e74705SXin Li@end
48*67e74705SXin Li
49*67e74705SXin Li// rdar://11671080
50*67e74705SXin Li@implementation Test3 // expected-warning {{autosynthesized property 'uid' will use synthesized instance variable '_uid', not existing instance variable 'uid'}}
51*67e74705SXin Li// Oops, forgot to write @synthesize! will be default synthesized
52*67e74705SXin Li- (void) myMethod {
53*67e74705SXin Li   self.uid = 0; // Use of the “setter”
54*67e74705SXin Li   uid = 0; // Use of the wrong instance variable
55*67e74705SXin Li   _uid = 0; // Use of the property instance variable
56*67e74705SXin Li}
57*67e74705SXin Li@end
58*67e74705SXin Li
59*67e74705SXin Li@interface Test4 {
60*67e74705SXin Li  id _var;
61*67e74705SXin Li}
62*67e74705SXin Li@property (readwrite, assign) id var;
63*67e74705SXin Li@end
64*67e74705SXin Li
65*67e74705SXin Li
66*67e74705SXin Li// default synthesize property named 'var'
67*67e74705SXin Li@implementation Test4
68*67e74705SXin Li- (id) myMethod {
69*67e74705SXin Li  return self->_var;  //  compiles because 'var' is synthesized by default
70*67e74705SXin Li}
71*67e74705SXin Li@end
72*67e74705SXin Li
73*67e74705SXin Li@interface Test5
74*67e74705SXin Li{
75*67e74705SXin Li  id _var;
76*67e74705SXin Li}
77*67e74705SXin Li@property (readwrite, assign) id var;
78*67e74705SXin Li@end
79*67e74705SXin Li
80*67e74705SXin Li// default synthesis of property 'var'
81*67e74705SXin Li@implementation Test5
82*67e74705SXin Li- (id) myMethod {
83*67e74705SXin Li  Test5 *foo = 0;
84*67e74705SXin Li  return foo->_var; // OK
85*67e74705SXin Li}
86*67e74705SXin Li@end
87*67e74705SXin Li
88*67e74705SXin Li@interface Test6
89*67e74705SXin Li{
90*67e74705SXin Li  id _var; // expected-note {{'_var' declared here}}
91*67e74705SXin Li}
92*67e74705SXin Li@property (readwrite, assign) id var;
93*67e74705SXin Li@end
94*67e74705SXin Li
95*67e74705SXin Li// no default synthesis. So error is expected.
96*67e74705SXin Li@implementation Test6
97*67e74705SXin Li- (id) myMethod
98*67e74705SXin Li{
99*67e74705SXin Li  return var; // expected-error {{use of undeclared identifier 'var'}}
100*67e74705SXin Li}
101*67e74705SXin Li@synthesize var = _var;
102*67e74705SXin Li@end
103*67e74705SXin Li
104*67e74705SXin Liint* _object;
105*67e74705SXin Li
106*67e74705SXin Li@interface Test7
107*67e74705SXin Li@property (readwrite, assign) id object;
108*67e74705SXin Li@end
109*67e74705SXin Li
110*67e74705SXin Li// With default synthesis, '_object' is be the synthesized ivar not the global
111*67e74705SXin Li// 'int*' object. So no error.
112*67e74705SXin Li@implementation Test7
113*67e74705SXin Li- (id) myMethod {
114*67e74705SXin Li  return _object;
115*67e74705SXin Li}
116*67e74705SXin Li@end
117*67e74705SXin Li
118*67e74705SXin Li// rdar://11671080
119*67e74705SXin Li@interface Test8
120*67e74705SXin Li{
121*67e74705SXin Li  id _y;
122*67e74705SXin Li  id y; // expected-note {{instance variable is declared here}}
123*67e74705SXin Li}
124*67e74705SXin Li@property(copy) id y; // expected-note {{property declared here}}
125*67e74705SXin Li@end
126*67e74705SXin Li
127*67e74705SXin Li
128*67e74705SXin Li@implementation Test8 @end // expected-warning {{autosynthesized property 'y' will use  instance variable '_y', not existing instance variable 'y'}}
129*67e74705SXin Li
130