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