objc: diagnose invalid argument to an

iboutletcollection attribute intead of crashing.
// rdar://10296078

llvm-svn: 142364
This commit is contained in:
Fariborz Jahanian 2011-10-18 17:11:10 +00:00
parent dfa7fb8fe6
commit 6b70865ec0
3 changed files with 19 additions and 1 deletions

View File

@ -138,7 +138,8 @@ def err_function_declared_typedef : Error<
"function definition declared 'typedef'">; "function definition declared 'typedef'">;
def err_iboutletcollection_builtintype : Error< def err_iboutletcollection_builtintype : Error<
"type argument of iboutletcollection attribute cannot be a builtin type">; "type argument of iboutletcollection attribute cannot be a builtin type">;
def err_iboutletcollection_with_protocol : Error<
"invalid argument of iboutletcollection attribute">;
def err_at_defs_cxx : Error<"@defs is not supported in Objective-C++">; def err_at_defs_cxx : Error<"@defs is not supported in Objective-C++">;
def err_at_in_class : Error<"unexpected '@' in member specification">; def err_at_in_class : Error<"unexpected '@' in member specification">;

View File

@ -245,6 +245,13 @@ void Parser::ParseGNUAttributeArgs(IdentifierInfo *AttrName,
ConsumeToken(); // Eat the comma, move to the next argument ConsumeToken(); // Eat the comma, move to the next argument
} }
} }
else if (Tok.is(tok::less) && AttrName->isStr("iboutletcollection")) {
if (!ExpectAndConsume(tok::less, diag::err_expected_less_after, "<",
tok::greater)) {
Diag(Tok, diag::err_iboutletcollection_with_protocol);
SkipUntil(tok::r_paren, false, true); // skip until ')'
}
}
SourceLocation RParen = Tok.getLocation(); SourceLocation RParen = Tok.getLocation();
if (!ExpectAndConsume(tok::r_paren, diag::err_expected_rparen)) { if (!ExpectAndConsume(tok::r_paren, diag::err_expected_rparen)) {

View File

@ -29,3 +29,13 @@ typedef void *PV;
@property __attribute__((iboutletcollection(BAD))) int prop3; // expected-error {{property with 'iboutletcollection' attribute must be an object type (invalid 'int')}} @property __attribute__((iboutletcollection(BAD))) int prop3; // expected-error {{property with 'iboutletcollection' attribute must be an object type (invalid 'int')}}
@end @end
// rdar://10296078
@interface ParentRDar10296078 @end
@class NSArray;
@protocol RDar10296078_Protocol;
@class RDar10296078_OtherClass;
@interface RDar10296078 : ParentRDar10296078
@property (nonatomic, strong)
__attribute__((iboutletcollection(RDar10296078_OtherClass<RDar10296078_Protocol>))) NSArray *stuff; // expected-error {{invalid argument of iboutletcollection attribute}}
@end