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 54 typedef 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