blob: 3f0ae0261daf4bb4d0e18bffaf5f72401d1068b9 [file] [log] [blame]
Rafael Espindola14f98892013-09-27 20:21:48 +00001// RUN: %clang_cc1 -fsyntax-only -verify -Wno-objc-root-class %s
Fariborz Jahanian77e2dde2010-02-09 21:49:50 +00002
3@interface NSString @end
4
5@interface NSObject @end
6
7@interface SynthItAll
8@property int howMany;
9@property (retain) NSString* what;
10@end
11
12@implementation SynthItAll
Fariborz Jahanianf83a6152012-02-02 00:15:51 +000013#if !__has_feature(objc_default_synthesize_properties)
14@synthesize howMany, what;
15#endif
Fariborz Jahanian77e2dde2010-02-09 21:49:50 +000016@end
17
18
19@interface SynthSetter : NSObject
20@property (nonatomic) int howMany; // REM: nonatomic to avoid warnings about only implementing one of the pair
21@property (nonatomic, retain) NSString* what;
22@end
23
24@implementation SynthSetter
Fariborz Jahanianf83a6152012-02-02 00:15:51 +000025#if !__has_feature(objc_default_synthesize_properties)
26@synthesize howMany, what;
27#endif
Fariborz Jahanian77e2dde2010-02-09 21:49:50 +000028
29- (int) howMany {
Fariborz Jahanian6aae87d2010-04-02 20:09:24 +000030 return self.howMany;
Fariborz Jahanian77e2dde2010-02-09 21:49:50 +000031}
32// - (void) setHowMany: (int) value
33
34- (NSString*) what {
Fariborz Jahanian6aae87d2010-04-02 20:09:24 +000035 return self.what;
Fariborz Jahanian77e2dde2010-02-09 21:49:50 +000036}
37// - (void) setWhat: (NSString*) value
38@end
39
40
41@interface SynthGetter : NSObject
42@property (nonatomic) int howMany; // REM: nonatomic to avoid warnings about only implementing one of the pair
43@property (nonatomic, retain) NSString* what;
44@end
45
46@implementation SynthGetter
Fariborz Jahanianf83a6152012-02-02 00:15:51 +000047#if !__has_feature(objc_default_synthesize_properties)
48@synthesize howMany, what;
49#endif
Fariborz Jahanian77e2dde2010-02-09 21:49:50 +000050
51// - (int) howMany
52- (void) setHowMany: (int) value {
Fariborz Jahanian6aae87d2010-04-02 20:09:24 +000053 self.howMany = value;
Fariborz Jahanian77e2dde2010-02-09 21:49:50 +000054}
55
56// - (NSString*) what
57- (void) setWhat: (NSString*) value {
Fariborz Jahanian6aae87d2010-04-02 20:09:24 +000058 if (self.what != value) {
Fariborz Jahanian77e2dde2010-02-09 21:49:50 +000059 }
60}
61@end
62
63
64@interface SynthNone : NSObject
65@property int howMany;
66@property (retain) NSString* what;
67@end
68
69@implementation SynthNone
Fariborz Jahanianf83a6152012-02-02 00:15:51 +000070#if !__has_feature(objc_default_synthesize_properties)
71@synthesize howMany, what; // REM: Redundant anyway
72#endif
Fariborz Jahanian77e2dde2010-02-09 21:49:50 +000073
74- (int) howMany {
Fariborz Jahanian6aae87d2010-04-02 20:09:24 +000075 return self.howMany;
Fariborz Jahanian77e2dde2010-02-09 21:49:50 +000076}
77- (void) setHowMany: (int) value {
Fariborz Jahanian6aae87d2010-04-02 20:09:24 +000078 self.howMany = value;
Fariborz Jahanian77e2dde2010-02-09 21:49:50 +000079}
80
81- (NSString*) what {
Fariborz Jahanian6aae87d2010-04-02 20:09:24 +000082 return self.what;
Fariborz Jahanian77e2dde2010-02-09 21:49:50 +000083}
84- (void) setWhat: (NSString*) value {
Fariborz Jahanian6aae87d2010-04-02 20:09:24 +000085 if (self.what != value) {
Fariborz Jahanian77e2dde2010-02-09 21:49:50 +000086 }
87}
88@end
89
Fariborz Jahaniand502a942010-04-21 18:57:20 +000090@protocol TopProtocol
91 @property (readonly) id myString;
92@end
93
94@interface TopClass <TopProtocol>
95{
Fariborz Jahanian738698d2010-05-03 15:49:20 +000096 id myString;
Fariborz Jahaniand502a942010-04-21 18:57:20 +000097}
98@end
99
Stephen Hines176edba2014-12-01 14:53:08 -0800100@interface SubClass : TopClass <TopProtocol>
Fariborz Jahaniand502a942010-04-21 18:57:20 +0000101@end
102
Stephen Hines176edba2014-12-01 14:53:08 -0800103@implementation SubClass @end
Fariborz Jahanian9d846322010-04-29 17:52:18 +0000104
Fariborz Jahanian24fce282010-11-09 02:16:57 +0000105// rdar://7920807
Fariborz Jahanian9d846322010-04-29 17:52:18 +0000106@interface C @end
107@interface C (Category)
Fariborz Jahanianb8607392011-08-27 21:55:47 +0000108@property int p; // expected-note 2 {{property declared here}}
Fariborz Jahanian9d846322010-04-29 17:52:18 +0000109@end
Fariborz Jahanianb8607392011-08-27 21:55:47 +0000110@implementation C (Category) // expected-warning {{property 'p' requires method 'p' to be defined}} \
111 // expected-warning {{property 'p' requires method 'setP:' to be defined}}
Fariborz Jahanian9d846322010-04-29 17:52:18 +0000112@end
113
Fariborz Jahaniand3635b92010-07-14 18:11:52 +0000114// Don't complain if a property is already @synthesized by usr.
115@interface D
116{
117}
118@property int PROP;
119@end
120
121@implementation D
Fariborz Jahanian527eec82011-07-22 01:06:53 +0000122- (int) Meth { return self.PROP; }
Fariborz Jahanianf83a6152012-02-02 00:15:51 +0000123#if __has_feature(objc_default_synthesize_properties)
Fariborz Jahanian78980052011-08-01 22:39:49 +0000124@synthesize PROP=IVAR;
Fariborz Jahanianf83a6152012-02-02 00:15:51 +0000125#endif
Fariborz Jahaniand3635b92010-07-14 18:11:52 +0000126@end
127
Fariborz Jahanianf8aba8c2011-12-15 01:03:18 +0000128// rdar://10567333
129@protocol MyProtocol
130@property (nonatomic, strong) NSString *requiredString; // expected-note {{property declared here}}
131
132@optional
133@property (nonatomic, strong) NSString *optionalString;
134@end
135
136@interface MyClass <MyProtocol>
137@end
138
Stephen Hines651f13c2014-04-23 16:59:28 -0700139@implementation MyClass // expected-warning {{auto property synthesis will not synthesize property 'requiredString' declared in protocol 'MyProtocol'}}
Fariborz Jahanianf8aba8c2011-12-15 01:03:18 +0000140@end
Stephen Hines176edba2014-12-01 14:53:08 -0800141
142// rdar://18152478
143@protocol NSObject @end
144@protocol TMSourceManagerDelegate<NSObject>
145@end
146
147@protocol TMSourceManager <NSObject>
148@property (nonatomic, assign) id <TMSourceManagerDelegate> delegate;
149@end
150
151@interface TMSourceManager
152@property (nonatomic, assign) id <TMSourceManagerDelegate> delegate;
153@end
154
155@protocol TMTimeZoneManager <TMSourceManager>
156@end
157
158@interface TimeZoneManager : TMSourceManager <TMTimeZoneManager>
159@end
160
161@implementation TimeZoneManager
162@end
163
164// rdar://18179833
165@protocol BaseProt
166@property (assign) id prot;
167@end
168
169@interface Base<BaseProt>
170@end
171
172@interface I : Base<BaseProt>
173@end
174
175@implementation I
176@end