]> granicus.if.org Git - clang/commitdiff
Test for default property synthesis.
authorFariborz Jahanian <fjahanian@apple.com>
Wed, 31 Aug 2011 23:32:48 +0000 (23:32 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Wed, 31 Aug 2011 23:32:48 +0000 (23:32 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@138917 91177308-0d34-0410-b5e6-96231b3b80d8

test/SemaObjC/default-synthesize-2.m [new file with mode: 0644]

diff --git a/test/SemaObjC/default-synthesize-2.m b/test/SemaObjC/default-synthesize-2.m
new file mode 100644 (file)
index 0000000..d402348
--- /dev/null
@@ -0,0 +1,118 @@
+// RUN: %clang_cc1 -x objective-c -fsyntax-only -fobjc-nonfragile-abi -fobjc-default-synthesize-properties -verify %s
+// RUN: %clang_cc1 -x objective-c++ -fsyntax-only -fobjc-nonfragile-abi -fobjc-default-synthesize-properties -verify %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 {
+id _object;
+} 
+@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
+