forked from OSchip/llvm-project
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:
parent
a3491665a6
commit
f4c6616d9d
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue