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:
Fariborz Jahanian 2013-02-08 23:32:30 +00:00
parent 63e5b4c269
commit f3c171ebec
2 changed files with 51 additions and 12 deletions

View File

@ -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");
}
}
}

View File

@ -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