xref: /llvm-project/clang/test/SemaObjC/arc-property-lifetime.m (revision 0f1c1be1968076d6f96f8a7bcc4a15cf195ecd97)
1// RUN: %clang_cc1 -triple x86_64-apple-darwin11 -fobjc-runtime-has-weak -fsyntax-only -fobjc-arc -verify -Wno-objc-root-class %s
2
3@interface Foo {
4@public
5    id __unsafe_unretained x; // expected-error {{existing instance variable 'x' for strong property 'x' may not be __unsafe_unretained}}
6    id __weak y; // expected-error {{existing instance variable 'y' for strong property 'y' may not be __weak}}
7    id __autoreleasing z; // expected-error {{instance variables cannot have __autoreleasing ownership}}
8}
9@property(strong) id x; // expected-note {{property declared here}}
10@property(strong) id y; // expected-note {{property declared here}}
11@property(strong) id z;
12@end
13
14@implementation Foo
15@synthesize x; // expected-note {{property synthesized here}}
16@synthesize y; // expected-note {{property synthesized here}}
17@synthesize z; // suppressed
18@end
19
20@interface Bar {
21@public
22    id __unsafe_unretained x; // expected-error {{existing instance variable 'x' for strong property 'x' may not be __unsafe_unretained}}
23    id __weak y; // expected-error {{existing instance variable 'y' for strong property 'y' may not be __weak}}
24    id __autoreleasing z; // expected-error {{instance variables cannot have __autoreleasing ownership}}
25}
26@property(retain) id x; // expected-note {{property declared here}}
27@property(retain) id y; // expected-note {{property declared here}}
28@property(retain) id z;
29@end
30
31@implementation Bar
32@synthesize x; // expected-note {{property synthesized here}}
33@synthesize y; // expected-note {{property synthesized here}}
34@synthesize z; // suppressed
35@end
36
37@interface Bas {
38@public
39    id __unsafe_unretained x; // expected-error {{existing instance variable 'x' for strong property 'x' may not be __unsafe_unretained}}
40    id __weak y; // expected-error {{existing instance variable 'y' for strong property 'y' may not be __weak}}
41    id __autoreleasing z; // expected-error {{instance variables cannot have __autoreleasing ownership}}
42}
43@property(copy) id x; // expected-note {{property declared here}}
44@property(copy) id y; // expected-note {{property declared here}}
45@property(copy) id z;
46@end
47
48@implementation Bas
49@synthesize x; // expected-note {{property synthesized here}}
50@synthesize y; // expected-note {{property synthesized here}}
51@synthesize z; // suppressed
52@end
53
54@interface Bat
55@property(strong) __unsafe_unretained id x; // expected-error {{strong property 'x' may not also be declared __unsafe_unretained}}
56@property(strong) __autoreleasing id z; // expected-error {{strong property 'z' may not also be declared __autoreleasing}}
57@end
58
59@interface Bau
60@property(retain) __unsafe_unretained id x; // expected-error {{strong property 'x' may not also be declared __unsafe_unretained}}
61@property(retain) __autoreleasing id z; // expected-error {{strong property 'z' may not also be declared __autoreleasing}}
62@end
63
64@interface Bav
65@property(copy) __unsafe_unretained id x; // expected-error {{strong property 'x' may not also be declared __unsafe_unretained}}
66@property(copy) __autoreleasing id z; // expected-error {{strong property 'z' may not also be declared __autoreleasing}}
67@end
68
69@interface Gorf  {
70   id __unsafe_unretained x;
71   id y; // expected-error {{existing instance variable 'y' for property 'y' with assign attribute must be __unsafe_unretained}}
72}
73@property(assign) id __unsafe_unretained x;
74@property(assign) id y; // expected-note {{property declared here}}
75@property(assign) id z;
76@end
77
78@implementation Gorf
79@synthesize x;
80@synthesize y; // expected-note {{property synthesized here}}
81@synthesize z;
82@end
83
84@interface Gorf2  {
85   id __unsafe_unretained x;
86   id y; // expected-error {{existing instance variable 'y' for property 'y' with unsafe_unretained attribute must be __unsafe_unretained}}
87}
88@property(unsafe_unretained) id __unsafe_unretained x;
89@property(unsafe_unretained) id y; // expected-note {{property declared here}}
90@property(unsafe_unretained) id z;
91@end
92
93@implementation Gorf2
94@synthesize x;
95@synthesize y; // expected-note {{property synthesized here}}
96@synthesize z;
97@end
98
99@interface I {
100  char _isAutosaving;
101}
102@property char isAutosaving;
103
104@end
105
106@implementation I
107@synthesize isAutosaving = _isAutosaving;
108@end
109
110// Test for 'Class' properties being unretained.
111@interface MyClass {
112@private
113    Class _controllerClass;
114    id _controllerId;
115}
116@property (copy) Class controllerClass;
117@property (copy) id controllerId;
118@end
119
120@implementation MyClass
121@synthesize controllerClass = _controllerClass;
122@synthesize controllerId = _controllerId;
123@end
124
125@interface UIView @end
126@class UIColor;
127
128@interface UIView(UIViewRendering)
129@property(nonatomic,copy) UIColor *backgroundColor;
130@end
131
132@interface UILabel : UIView
133@end
134
135@interface MyView
136@property (strong) UILabel *label;
137@end
138
139@interface MyView2 : MyView @end
140
141@implementation MyView2
142- (void)foo {
143  super.label.backgroundColor = 0;
144}
145@end
146
147@interface Baz
148@property  id prop;
149@property  __strong id strong_prop;
150@property  (strong) id strong_attr_prop;
151@property  (strong) __strong id really_strong_attr_prop;
152+ (id) alloc;
153- (id) init;
154- (id) implicit;
155- (void) setImplicit : (id) arg;
156@end
157
158void foo(Baz *f) {
159        f.prop = [[Baz alloc] init];
160        f.strong_prop = [[Baz alloc] init];
161        f.strong_attr_prop = [[Baz alloc] init];
162        f.really_strong_attr_prop = [[Baz alloc] init];
163        f.implicit = [[Baz alloc] init];
164}
165
166@interface Boom
167{
168  const void * innerPointerIvar __attribute__((objc_returns_inner_pointer)); // expected-error {{'objc_returns_inner_pointer' attribute only applies to Objective-C methods and Objective-C properties}}
169}
170@property (readonly) Boom * NotInnerPointer __attribute__((objc_returns_inner_pointer)); // expected-warning {{'objc_returns_inner_pointer' attribute only applies to properties that return a non-retainable pointer}}
171- (Boom *) NotInnerPointerMethod __attribute__((objc_returns_inner_pointer)); // expected-warning {{'objc_returns_inner_pointer' attribute only applies to methods that return a non-retainable pointer}}
172@property (readonly) const void * innerPointer __attribute__((objc_returns_inner_pointer));
173@end
174
175@interface Foo2 {
176  id _prop; // expected-error {{existing instance variable '_prop' for property 'prop' with assign attribute must be __unsafe_unretained}}
177}
178@property (nonatomic, assign) id prop; // expected-note {{property declared here}}
179@end
180
181@implementation Foo2
182@end
183
184@interface NSObject
185-(id)init;
186@end
187
188typedef char BOOL;
189@interface Test13885083 : NSObject
190
191@property (nonatomic, assign) BOOL retain; // expected-error {{ARC forbids synthesis of 'retain'}}
192
193-(id)init;
194
195@end
196
197@implementation Test13885083
198-(id) init
199{
200  self = [super init];
201  return self;
202}
203@end
204
205