objective-C: don't issue bogus warning about
"auto-synthesized may not work correctly with 'nib' loader" when 'readonly' property is redeclared 'readwrite' in class extension. // rdar://13123861 llvm-svn: 174775
This commit is contained in:
parent
63e5b4c269
commit
f3c171ebec
|
@ -839,22 +839,40 @@ Decl *Sema::ActOnPropertyImplDecl(Scope *S,
|
|||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (Synthesize&&
|
||||
(PIkind & ObjCPropertyDecl::OBJC_PR_readonly) &&
|
||||
property->hasAttr<IBOutletAttr>() &&
|
||||
!AtLoc.isValid()) {
|
||||
Diag(IC->getLocation(), diag::warn_auto_readonly_iboutlet_property);
|
||||
Diag(property->getLocation(), diag::note_property_declare);
|
||||
SourceLocation readonlyLoc;
|
||||
if (LocPropertyAttribute(Context, "readonly",
|
||||
property->getLParenLoc(), readonlyLoc)) {
|
||||
SourceLocation endLoc =
|
||||
readonlyLoc.getLocWithOffset(strlen("readonly")-1);
|
||||
SourceRange ReadonlySourceRange(readonlyLoc, endLoc);
|
||||
Diag(property->getLocation(),
|
||||
diag::note_auto_readonly_iboutlet_fixup_suggest) <<
|
||||
FixItHint::CreateReplacement(ReadonlySourceRange, "readwrite");
|
||||
bool ReadWriteProperty = false;
|
||||
// Search into the class extensions and see if 'readonly property is
|
||||
// redeclared 'readwrite', then no warning is to be issued.
|
||||
for (ObjCInterfaceDecl::known_extensions_iterator
|
||||
Ext = IDecl->known_extensions_begin(),
|
||||
ExtEnd = IDecl->known_extensions_end(); Ext != ExtEnd; ++Ext) {
|
||||
DeclContext::lookup_result R = Ext->lookup(property->getDeclName());
|
||||
if (!R.empty())
|
||||
if (ObjCPropertyDecl *ExtProp = dyn_cast<ObjCPropertyDecl>(R[0])) {
|
||||
PIkind = ExtProp->getPropertyAttributesAsWritten();
|
||||
if (PIkind & ObjCPropertyDecl::OBJC_PR_readwrite) {
|
||||
ReadWriteProperty = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!ReadWriteProperty) {
|
||||
Diag(IC->getLocation(), diag::warn_auto_readonly_iboutlet_property);
|
||||
Diag(property->getLocation(), diag::note_property_declare);
|
||||
SourceLocation readonlyLoc;
|
||||
if (LocPropertyAttribute(Context, "readonly",
|
||||
property->getLParenLoc(), readonlyLoc)) {
|
||||
SourceLocation endLoc =
|
||||
readonlyLoc.getLocWithOffset(strlen("readonly")-1);
|
||||
SourceRange ReadonlySourceRange(readonlyLoc, endLoc);
|
||||
Diag(property->getLocation(),
|
||||
diag::note_auto_readonly_iboutlet_fixup_suggest) <<
|
||||
FixItHint::CreateReplacement(ReadonlySourceRange, "readwrite");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -21,3 +21,24 @@
|
|||
|
||||
@implementation I // expected-warning 3 {{readonly IBOutlet property when auto-synthesized may not work correctly with 'nib' loader}}
|
||||
@end
|
||||
|
||||
|
||||
// rdar://13123861
|
||||
@class UILabel;
|
||||
|
||||
@interface NSObject @end
|
||||
|
||||
@interface RKTFHView : NSObject
|
||||
@property( readonly ) __attribute__((iboutlet)) UILabel *autoReadOnlyReadOnly; // expected-note {{property declared here}} expected-note {{readonly IBOutlet property should be changed to be readwrite}}
|
||||
@property( readonly ) __attribute__((iboutlet)) UILabel *autoReadOnlyReadWrite;
|
||||
@property( readonly ) __attribute__((iboutlet)) UILabel *synthReadOnlyReadWrite;
|
||||
@end
|
||||
|
||||
@interface RKTFHView()
|
||||
@property( readwrite ) __attribute__((iboutlet)) UILabel *autoReadOnlyReadWrite;
|
||||
@property( readwrite ) __attribute__((iboutlet)) UILabel *synthReadOnlyReadWrite;
|
||||
@end
|
||||
|
||||
@implementation RKTFHView // expected-warning {{readonly IBOutlet property when auto-synthesized may not work correctly with 'nib' loader}}
|
||||
@synthesize synthReadOnlyReadWrite=_synthReadOnlyReadWrite;
|
||||
@end
|
||||
|
|
Loading…
Reference in New Issue