130 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Objective-C
		
	
	
	
			
		
		
	
	
			130 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Objective-C
		
	
	
	
| // RUN: %clang_cc1 -x objective-c -fsyntax-only -verify -Wno-objc-root-class %s
 | |
| // RUN: %clang_cc1 -x objective-c++ -fsyntax-only -verify -Wno-objc-root-class %s
 | |
| // rdar://8843851
 | |
| 
 | |
| @interface StopAccessingIvarsDirectlyExample
 | |
| @property(strong) id name, rank, serialNumber;
 | |
| @end
 | |
| 
 | |
| @implementation StopAccessingIvarsDirectlyExample
 | |
| 
 | |
| - (void)identifyYourSelf {
 | |
|     if (self.name && self.rank && self.serialNumber)
 | |
|       self.name = 0;
 | |
| }
 | |
| 
 | |
| // @synthesize name, rank, serialNumber;
 | |
| // default synthesis allows direct access to property ivars.
 | |
| - (id)init {
 | |
|         _name = _rank = _serialNumber = 0;
 | |
| 	return self;
 | |
| }
 | |
| 
 | |
| - (void)dealloc {	
 | |
| }
 | |
| @end
 | |
| 
 | |
| 
 | |
| // Test2
 | |
| @interface Test2 
 | |
| @property(strong, nonatomic) id object;
 | |
| @end
 | |
| 
 | |
| // object has user declared setter/getter so it won't be
 | |
| // default synthesized; thus causing user error.
 | |
| @implementation Test2
 | |
| - (id) bar { return object; } // expected-error {{use of undeclared identifier 'object'}}
 | |
| - (void)setObject:(id)newObject {}
 | |
| - (id)object { return 0; }
 | |
| @end
 | |
| 
 | |
| // Test3
 | |
| @interface Test3 
 | |
| { 
 | |
|   id uid;  // expected-note {{instance variable is declared here}}
 | |
| } 
 | |
| @property (readwrite, assign) id uid;  // expected-note {{property declared here}}
 | |
| @end
 | |
| 
 | |
| // rdar://11671080
 | |
| @implementation Test3 // expected-warning {{autosynthesized property 'uid' will use synthesized instance variable '_uid', not existing instance variable 'uid'}}
 | |
| // Oops, forgot to write @synthesize! will be default synthesized
 | |
| - (void) myMethod { 
 | |
|    self.uid = 0; // Use of the “setter” 
 | |
|    uid = 0; // Use of the wrong instance variable
 | |
|    _uid = 0; // Use of the property instance variable
 | |
| } 
 | |
| @end
 | |
| 
 | |
| @interface Test4 { 
 | |
|   id _var;
 | |
| } 
 | |
| @property (readwrite, assign) id var; 
 | |
| @end
 | |
| 
 | |
| 
 | |
| // default synthesize property named 'var'
 | |
| @implementation Test4 
 | |
| - (id) myMethod {
 | |
|   return self->_var;  //  compiles because 'var' is synthesized by default
 | |
| }
 | |
| @end
 | |
| 
 | |
| @interface Test5 
 | |
| { 
 | |
|   id _var;
 | |
| } 
 | |
| @property (readwrite, assign) id var; 
 | |
| @end
 | |
| 
 | |
| // default synthesis of property 'var'
 | |
| @implementation Test5 
 | |
| - (id) myMethod {
 | |
|   Test5 *foo = 0; 
 | |
|   return foo->_var; // OK
 | |
| } 
 | |
| @end
 | |
| 
 | |
| @interface Test6 
 | |
| { 
 | |
|   id _var; // expected-note {{'_var' declared here}}
 | |
| } 
 | |
| @property (readwrite, assign) id var; 
 | |
| @end
 | |
| 
 | |
| // no default synthesis. So error is expected.
 | |
| @implementation Test6 
 | |
| - (id) myMethod 
 | |
| {
 | |
|   return var; // expected-error {{use of undeclared identifier 'var'}}
 | |
| } 
 | |
| @synthesize var = _var; 
 | |
| @end
 | |
| 
 | |
| int* _object;
 | |
| 
 | |
| @interface Test7
 | |
| @property (readwrite, assign) id object; 
 | |
| @end
 | |
| 
 | |
| // With default synthesis, '_object' is be the synthesized ivar not the global
 | |
| // 'int*' object. So no error.
 | |
| @implementation Test7 
 | |
| - (id) myMethod {
 | |
|   return _object;
 | |
| } 
 | |
| @end
 | |
| 
 | |
| // rdar://11671080
 | |
| @interface Test8
 | |
| {
 | |
|   id _y;
 | |
|   id y; // expected-note {{instance variable is declared here}}
 | |
| }
 | |
| @property(copy) id y; // expected-note {{property declared here}}
 | |
| @end
 | |
| 
 | |
| 
 | |
| @implementation Test8 @end // expected-warning {{autosynthesized property 'y' will use  instance variable '_y', not existing instance variable 'y'}}
 | |
| 
 |