fix a crash on unnamed properties like:

@property (readonly) int : 4;

llvm-svn: 57805
This commit is contained in:
Chris Lattner 2008-10-20 06:33:53 +00:00
parent e0d3fe9b97
commit 93429b047b
3 changed files with 27 additions and 7 deletions

View File

@ -418,6 +418,8 @@ DIAG(err_objc_illegal_interface_qual, ERROR,
"illegal interface qualifier")
DIAG(err_objc_expected_equal, ERROR,
"setter/getter expects '=' followed by name")
DIAG(err_objc_property_requires_field_name, ERROR,
"@property requires fields to be named")
DIAG(err_objc_expected_property_attr, ERROR,
"unknown property attribute detected")
DIAG(err_objc_unexpected_attr, ERROR,

View File

@ -316,21 +316,27 @@ void Parser::ParseObjCInterfaceDeclList(DeclTy *interfaceDecl,
// Convert them all to property declarations.
for (unsigned i = 0, e = FieldDeclarators.size(); i != e; ++i) {
FieldDeclarator &FD = FieldDeclarators[i];
if (FD.D.getIdentifier() == 0) {
Diag(AtLoc, diag::err_objc_property_requires_field_name,
FD.D.getSourceRange());
continue;
}
// Install the property declarator into interfaceDecl.
IdentifierInfo *SelName =
OCDS.getGetterName() ? OCDS.getGetterName() : FD.D.getIdentifier();
Selector GetterSel =
PP.getSelectorTable().getNullarySelector(OCDS.getGetterName()
? OCDS.getGetterName()
: FD.D.getIdentifier());
PP.getSelectorTable().getNullarySelector(SelName);
IdentifierInfo *SetterName = OCDS.getSetterName();
if (!SetterName)
SetterName = constructSetterName(PP.getIdentifierTable(),
FD.D.getIdentifier());
Selector SetterSel =
PP.getSelectorTable().getUnarySelector(SetterName);
DeclTy *Property = Actions.ActOnProperty(CurScope,
AtLoc, FD, OCDS,
GetterSel, SetterSel,
MethodImplKind);
DeclTy *Property = Actions.ActOnProperty(CurScope, AtLoc, FD, OCDS,
GetterSel, SetterSel,
MethodImplKind);
allProperties.push_back(Property);
}
break;

View File

@ -36,3 +36,15 @@ typedef signed char BOOL;
@implementation MyClass
@synthesize myIvar = _myIvar;
@end
@interface BadPropClass
{
}
@property (readonly) int; // expected-warning {{declaration does not declare anything}}
@property (readonly) ; // expected-error {{type name requires a specifier or qualifier}} \
expected-warning {{declaration does not declare anything}}
@property (readonly) int : 4; // expected-error {{property requires fields to be named}}
@end