1// RUN: %clang_cc1  -fsyntax-only -Wunused-property-ivar -verify -Wno-objc-root-class %s
2// rdar://14989999
3
4@interface NSObject @end
5
6@interface Example : NSObject
7@property (nonatomic, copy) id t; // expected-note {{property declared here}}
8@property (nonatomic, copy) id u; // expected-note {{property declared here}}
9@property (nonatomic, copy) id v; // expected-note {{property declared here}}
10@property (nonatomic, copy) id w;
11@property (nonatomic, copy) id x; // expected-note {{property declared here}}
12@property (nonatomic, copy) id y; // expected-note {{property declared here}}
13@property (nonatomic, copy) id z;
14@property (nonatomic, copy) id ok;
15@end
16
17@implementation Example
18- (void) setX:(id)newX {  // expected-warning {{ivar '_x' which backs the property is not referenced in this property's accessor}}
19    _y = newX;
20}
21- (id) y { // expected-warning {{ivar '_y' which backs the property is not referenced in this property's accessor}}
22  return _v;
23}
24
25- (void) setV:(id)newV { // expected-warning {{ivar '_v' which backs the property is not referenced in this property's accessor}}
26    _y = newV;
27}
28
29// No warning here because there is no backing ivar.
30// both setter/getter are user defined.
31- (void) setW:(id)newW {
32    _y = newW;
33}
34- (id) w {
35  return _v;
36}
37
38- (id) u { // expected-warning {{ivar '_u' which backs the property is not referenced in this property's accessor}}
39  return _v;
40}
41
42@synthesize ok = okIvar;
43- (void) setOk:(id)newOk {
44    okIvar = newOk;
45}
46
47@synthesize t = tIvar;
48- (void) setT:(id)newT { // expected-warning {{ivar 'tIvar' which backs the property is not referenced in this property's accessor}}
49    okIvar = newT;
50}
51@end
52
53// rdar://15473432
54typedef char BOOL;
55@interface CalDAVServerVersion {
56  BOOL _supportsTimeRangeFilterWithoutEndDate;
57}
58@property (nonatomic, readonly,nonatomic) BOOL supportsTimeRangeFilterWithoutEndDate;
59@end
60
61@interface CalDAVConcreteServerVersion : CalDAVServerVersion {
62}
63@end
64
65@interface CalendarServerVersion : CalDAVConcreteServerVersion
66@end
67
68@implementation CalDAVServerVersion
69@synthesize supportsTimeRangeFilterWithoutEndDate=_supportsTimeRangeFilterWithoutEndDate;
70@end
71
72@implementation CalendarServerVersion
73-(BOOL)supportsTimeRangeFilterWithoutEndDate {
74  return 0;
75}
76@end
77
78// rdar://15630719
79@interface CDBModifyRecordsOperation : NSObject
80@property (nonatomic, assign) BOOL atomic;
81@end
82
83@class NSString;
84
85@implementation CDBModifyRecordsOperation
86- (void)setAtomic:(BOOL)atomic {
87  if (atomic == __objc_yes) {
88    NSString *recordZoneID = 0;
89  }
90  _atomic = atomic;
91}
92@end
93
94// rdar://15728901
95@interface GATTOperation : NSObject {
96    long operation;
97}
98@property(assign) long operation;
99@end
100
101@implementation GATTOperation
102@synthesize operation;
103+ (id) operation {
104    return 0;
105}
106@end
107
108// rdar://15727327
109@interface Radar15727327 : NSObject
110@property (assign, readonly) long p;
111@property (assign) long q; // expected-note 2 {{property declared here}}
112@property (assign, readonly) long r; // expected-note {{property declared here}}
113- (long)Meth;
114@end
115
116@implementation Radar15727327
117@synthesize p;
118@synthesize q;
119@synthesize r;
120- (long)Meth { return p; }
121- (long) p { [self Meth]; return 0;  }
122- (long) q { return 0; } // expected-warning {{ivar 'q' which backs the property is not referenced in this property's accessor}}
123- (void) setQ : (long) val { } // expected-warning {{ivar 'q' which backs the property is not referenced in this property's accessor}}
124- (long) r { [self Meth]; return p; } // expected-warning {{ivar 'r' which backs the property is not referenced in this property's accessor}}
125@end
126
127@interface I1
128@property (readonly) int p1;
129@property (readonly) int p2; // expected-note {{property declared here}}
130@end
131
132@implementation I1
133@synthesize p1=_p1;
134@synthesize p2=_p2;
135
136-(int)p1 {
137  return [self getP1];
138}
139-(int)getP1 {
140  return _p1;
141}
142-(int)getP2 {
143  return _p2;
144}
145-(int)p2 {  // expected-warning {{ivar '_p2' which backs the property is not referenced in this property's accessor}}
146  Radar15727327 *o;
147  return [o Meth];
148}
149@end
150
151// rdar://15873425
152@protocol MyProtocol
153@property (nonatomic, readonly) int myProperty;
154@end
155
156@interface MyFirstClass : NSObject <MyProtocol>
157@end
158
159@interface MySecondClass : NSObject <MyProtocol>
160@end
161
162@implementation MyFirstClass
163@synthesize myProperty;
164@end
165
166@implementation MySecondClass
167@dynamic myProperty;
168-(int)myProperty  // should not warn; property is dynamic
169{
170    return 0;
171}
172@end
173
174// rdar://15890251
175@class NSURL;
176
177@protocol MCCIDURLProtocolDataProvider
178@required
179@property(strong, atomic, readonly) NSURL *cidURL;
180@property(strong, atomic, readonly) NSURL *cidURL1; // expected-note {{property declared here}}
181@end
182
183@interface UnrelatedClass : NSObject <MCCIDURLProtocolDataProvider>
184@end
185
186@implementation UnrelatedClass
187@synthesize cidURL = _cidURL;
188@synthesize cidURL1 = _cidURL1;
189@end
190
191@interface MUIWebAttachmentController : NSObject <MCCIDURLProtocolDataProvider>
192@end
193
194
195@implementation MUIWebAttachmentController
196- (NSURL *)cidURL {
197    return 0;
198}
199@synthesize cidURL1  = _cidURL1;
200- (NSURL *)cidURL1 { // expected-warning {{ivar '_cidURL1' which backs the property is not referenced in this property's accessor}}
201    return 0;
202}
203@end
204