Fix crash on null deference when searching for readwrite properties in

categories.
 - Also, simplify nesting via early return.

llvm-svn: 61968
This commit is contained in:
Daniel Dunbar 2009-01-09 01:04:21 +00:00
parent a3491665a6
commit f4c6616d9d
2 changed files with 32 additions and 13 deletions

View File

@ -252,24 +252,26 @@ void ObjCMethodDecl::setMethodParams(ParmVarDecl **NewParamInfo,
}
}
/// isPropertyReadonly - Return true if property is a readonly, by seaching
/// isPropertyReadonly - Return true if property is readonly, by searching
/// for the property in the class and in its categories.
///
bool ObjCInterfaceDecl::isPropertyReadonly(ObjCPropertyDecl *PDecl) const
{
if (PDecl->isReadOnly()) {
// Main class has the property as 'readyonly'. Must search
// through the category list to see if the property's
// attribute has been over-ridden to 'readwrite'.
for (ObjCCategoryDecl *Category = getCategoryList();
Category; Category = Category->getNextClassCategory()) {
PDecl= Category->FindPropertyDeclaration(PDecl->getIdentifier());
if (PDecl && !PDecl->isReadOnly())
return false;
}
return true;
if (!PDecl->isReadOnly())
return false;
// Main class has the property as 'readonly'. Must search
// through the category list to see if the property's
// attribute has been over-ridden to 'readwrite'.
for (ObjCCategoryDecl *Category = getCategoryList();
Category; Category = Category->getNextClassCategory()) {
ObjCPropertyDecl *P =
Category->FindPropertyDeclaration(PDecl->getIdentifier());
if (P && !P->isReadOnly())
return false;
}
return false;
return true;
}
/// FindPropertyDeclaration - Finds declaration of the property given its name

View File

@ -33,3 +33,20 @@ int main(int argc, char **argv) {
return test.object - 12345 + test.Anotherobject - 200;
}
///
@interface I0
@property(readonly) int p0;
@end
@interface I0 (Cat0)
@end
@interface I0 (Cat1)
@end
@implementation I0
- (void) foo {
self.p0 = 0; // expected-error {{assigning to property with 'readonly' attribute not allowed}}
}
@end