1// RUN: %clang_cc1 -fsyntax-only -verify -Wno-objc-root-class %s
2
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
13#if !__has_feature(objc_default_synthesize_properties)
14@synthesize howMany, what;
15#endif
16@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
25#if !__has_feature(objc_default_synthesize_properties)
26@synthesize howMany, what;
27#endif
28
29- (int) howMany {
30    return self.howMany;
31}
32// - (void) setHowMany: (int) value
33
34- (NSString*) what {
35    return self.what;
36}
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
47#if !__has_feature(objc_default_synthesize_properties)
48@synthesize howMany, what;
49#endif
50
51// - (int) howMany
52- (void) setHowMany: (int) value {
53    self.howMany = value;
54}
55
56// - (NSString*) what
57- (void) setWhat: (NSString*) value {
58    if (self.what != value) {
59    }
60}
61@end
62
63
64@interface SynthNone : NSObject
65@property int howMany;
66@property (retain) NSString* what;
67@end
68
69@implementation SynthNone
70#if !__has_feature(objc_default_synthesize_properties)
71@synthesize howMany, what;  // REM: Redundant anyway
72#endif
73
74- (int) howMany {
75    return self.howMany;
76}
77- (void) setHowMany: (int) value {
78    self.howMany = value;
79}
80
81- (NSString*) what {
82    return self.what;
83}
84- (void) setWhat: (NSString*) value {
85    if (self.what != value) {
86    }
87}
88@end
89
90@protocol TopProtocol
91  @property (readonly) id myString;
92@end
93
94@interface TopClass <TopProtocol>
95{
96  id myString;
97}
98@end
99
100@interface SubClass : TopClass <TopProtocol>
101@end
102
103@implementation SubClass @end
104
105// rdar://7920807
106@interface C @end
107@interface C (Category)
108@property int p; // expected-note 2 {{property declared here}}
109@end
110@implementation C (Category) // expected-warning {{property 'p' requires method 'p' to be defined}} \
111                             // expected-warning {{property 'p' requires method 'setP:' to be defined}}
112@end
113
114// 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
122- (int) Meth { return self.PROP; }
123#if __has_feature(objc_default_synthesize_properties)
124@synthesize PROP=IVAR;
125#endif
126@end
127
128// 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
139@implementation MyClass // expected-warning {{auto property synthesis will not synthesize property 'requiredString' declared in protocol 'MyProtocol'}}
140@end
141
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
177