diff options
author | Zancanaro; Carlo <czan8762@plang3.cs.usyd.edu.au> | 2012-09-24 09:58:17 +1000 |
---|---|---|
committer | Zancanaro; Carlo <czan8762@plang3.cs.usyd.edu.au> | 2012-09-24 09:58:17 +1000 |
commit | 222e2a7620e6520ffaf4fc4e69d79c18da31542e (patch) | |
tree | 7bfbc05bfa3b41c8f9d2e56d53a0bc3e310df239 /clang/test/SemaObjC/default-synthesize-2.m | |
parent | 3d206f03985b50beacae843d880bccdc91a9f424 (diff) |
Add the clang library to the repo (with some of my changes, too).
Diffstat (limited to 'clang/test/SemaObjC/default-synthesize-2.m')
-rw-r--r-- | clang/test/SemaObjC/default-synthesize-2.m | 116 |
1 files changed, 116 insertions, 0 deletions
diff --git a/clang/test/SemaObjC/default-synthesize-2.m b/clang/test/SemaObjC/default-synthesize-2.m new file mode 100644 index 0000000..b95f263 --- /dev/null +++ b/clang/test/SemaObjC/default-synthesize-2.m @@ -0,0 +1,116 @@ +// RUN: %clang_cc1 -x objective-c -fsyntax-only -fobjc-default-synthesize-properties -verify -Wno-objc-root-class %s +// RUN: %clang_cc1 -x objective-c++ -fsyntax-only -fobjc-default-synthesize-properties -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; +} +@property (readwrite, assign) id uid; +@end + +@implementation Test3 +// 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 + |