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