forked from OSchip/llvm-project
objc: diagnose invalid argument to an
iboutletcollection attribute intead of crashing. // rdar://10296078 llvm-svn: 142364
This commit is contained in:
parent
dfa7fb8fe6
commit
6b70865ec0
|
@ -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">;
|
||||||
|
|
||||||
|
|
|
@ -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)) {
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue